Re- Mein Spiel.... erster Eindruck

← Zurück

Von Kveldulfur an Dr. Irata, DrIrata

Hallo!

Ich habe bei Fiverr einen Musiker gefunden für 8-Bit-Musik, der gegen Aufpreis mir eine Partitur erstellt hat.

Auftragstext: "Ich erstelle einen Audiotrack 60 Sekunden, 8-Bit Musik mit 3 Instrumenten (Melodie, Bass, Rhythmus) inkl. Notenblatt. Exklusive und unbegrenzte Nutzungsrechte für den Kunden."

Ich führe den Namen des Komponisten (habe die Erlaubnis) im Spiel auf. Will keine falschen Lorbeeren ernten.

Mich würde echt interessieren, ob er das Stück wirklich nur einmal verkauft hat (darf ja nicht anders) oder ob sich alles gleich anhört ;)

"matthiaswebel" heisst der Musiker auf Fiverr. Schreib ihn an und... naja, wäre gespannt wie sich Dein Song anhört. https://de.fiverr.com/matthiaswebel

Grüße Janko

Antworten

Hi!

Wieso nerven? Das ist doch das tolle am Forum. Ich kann Dir jetzt etwas helfen und vorher habe ich bei Dir eine Menge abgeschaut. Und die Infos der Anderen sind genial.

Ich habe 50 Euro bezahlt. Zu dem Zeitpunkt war die Neugier größer als die Idee ein Spiel zu programmieren. Ich gab an wofür ich den Song benötige, wobei Monster Burger damals in meinem Kopf umher schwirrte. Bekommen habe ich die Partitur (einen Auszug sieht Du in seinem Profil), eine Wave-Datei (auch dort zu hören) und die Nutzungsrechte. Ich bin übrigens "SneakyV" ;-) Die WAVE-Datei wollte ich, um zu hören wie es klingen soll. Die Partitur habe ich dann in Text umgeschrieben... also C, Cis, H, A usw. und dann daraus mir die ATARI-Hex-Codes rausgesucht.

Die Bass-Spur und der Rhythmus war für mich anfangs nicht im ATARI umsetzbar... aber das habe ich jetzt zum Glück gelöst. Im RMT gab es eine vollständige Tabelle der Noten bei Verzerrung C (Bass). Die Excel-Tabelle war nicht vollständig oder ich habe die falsch gelesen.

Grüße Janko

Antworten

Hi!

Wenn Du Songs2See meinst, dann ist das nicht schlecht. Aber auf die Korrektheit würde ich mich nicht verlassen. Eine Wave-Datei ist ja keine Midi-Datei, wo die einzelnen Spuren getrennt sind. Eine Partitur ist da sicherer ;-)

Grüße Janko

Antworten

Hallo!

Ja, es sind 60 Sekunden.

Hier die genaue Aufstellung:

Player: 4B51 bis 4C8B = 314 Bytes allg. Daten: 4C8B bis 4CB6 = 43 Bytes

Musikdaten: Hauptthema: 4CB7 bis 4E15 = 494 Bytes 2. Stimme: 4E16 bis 4E8A = 74 Bytes Bass: 4E8B bis 50DB = 592 Bytes Rythmus: 50DC bis 53D0 = 756 Bytes

Gesamt: 2175 Bytes

Der RMT-Player war indes nicht sparsamer: 1268 Bytes für die Musikdaten und 1024 für den Player = 2292 Bytes. Der RMT ist aber im Speicher unflexibler meiner Meinung nach.

Antworten

Ja, die Noten zu lesen war auch mein Problem. Ich habe, auch wenn es etwas aufwendig ist, die Partitur in MuseScore3 übernommen und dann beschriften lassen... :-) musescore3.png So war es dann etwas einfach für mich die Daten zu nutzen :mrgreen:

Grüße Janko

Antworten

Man kann durch die Verzerrung C tiefere Töne erzeugen. Verzerrung A = Purer Ton Verzerrung B = Bass Ton (man muss aber eine andere Tabelle dort anhalten, der Ton ist "unsauber")

Janko

Antworten

Nein, da ich die 4 Stimmen einzeln nutzen wollte. Also alles 8 Bit nur die Verzerrung angepasst.

Antworten

Hallo!

und die Länge der Noten entsprechend mit der wave-Datei abgeglichen

Nein, die Länge der Note steht ja an der Note selbst. Volle, halbe, viertel und achtelnoten sind relativ schnell zu erkennen. Die Tonhöhe hat mir am meisten Probleme gemacht :-)

Ich habe nicht die SFX-Engine genutzt, sondern den Player aus der Hexenküche von Peter Finzel. Diesen Player habe ich aber dann um einiges erweitern müssen, damit überhaupt Rythmus möglich war. Auch war der Player auf 128 Werte-Paare begrenzt, was ich erweitern musste. Aber generell ist der Player von Herrn Finzel aus der Hexenküche der Ausgangspunkt.... Ich bin immer noch am Optimieren des Players, aber wenn Du möchtest, kannst Du ihn gerne nutzen.

Grüße Janko

Antworten

... übrigens habe ich tatsächlich auch die allerersten Sounds (also Explosion) mit der Beschreibung der Hexenküche erzeugt... dann die sfx-Engine zusätzlich implementiert... und jetzt hört sich alles ganz schräg an ;-)

Antworten

Hallo!

Hier mein Code. Ich habe meine Musik als Beispiel drin gelassen... die bitte nicht weitergeben ;) Ich hoffe, es ist einigermaßen selbsterklärend.

  org $2000

  icl 'Systemkonstanten.asm'

  .proc main

  jsr TitelMusik.MUSINI

?mainloop lda RTCLOK+2 ?loop cmp RTCLOK+2
beq ?loop

        jsr TitelMusik.MUSPLAY  ; Muss alle 1/50 Sekunde aufgerufen werden (z.B. im VBI)

        jmp ?mainloop

        .end

        run main

; ; ;************ ; Ab hier kommt die Musikroutine, die man einbinden kann ; ;** .proc TitelMusik

PAUSE EQU 255 ; Code f. Pause P EQU PAUSE ; Kuerzel f. Pause START EQU 254 ; Code fuer Stimm-Neubeginn ENDE EQU 253 ; Code fuer Stimmende HUELLKURVE EQU 252 ; Code fuer Huellkurve K EQU HUELLKURVE ; Kuerzel f. Huellkruve ; DAUER EQU 4 ; Dauer eines 16tel ; V EQU DAUER16 ; H EQU DAUER8 ; Halbe Note Q EQU DAUER4 ; Viertel Note (Quarter) E EQU DAUER2 ; Achtel Note (Eight) S EQU DAUER ; Sechzehntel Note ; ;******* ; Interne Variablen fuer MUSIK ;******* ;

CSREGL EQU $CE ; Zeropageregister CSREGH EQU $CF

;**************************************************
; VBI-Routine, alle 1/50sec. aufgerufen
;**************************************************
;

MUSPLAY LDX #0 ; Kanal 0 zuerst spielen MUNXKN STX MUKANAL ; Kanal merken JSR MUXPLY ; Ton für Stimme holen JSR MUXHUL ; Huellkurve f. eine Stimme holen JSR MUPLAY ; Ton/Huellkruve spielen INX ; naechste Stimme CPX #4 ; schon alle 4 Stimmen? BNE MUNXKN ; nein --> ; RTS ; ;******* ; Initialisierungsroutine ; POKEY init., Variable loeschen, VBI setzen ;******* ; MUSINI LDA #0 ; POKEY und Variablen loeschen LDX #3 ; je 4 Register ; MUSEN1 STA AUDF1,X ; AUDF/C 1/2 STA AUDF1+4,X ; AUDF/C 3/4 STA MUDUR1,X ; Tondauer:=0 STA MUHPT1,X ; Huellk.-Zeiger:=Tabellenanfang DEX ; schon alle 4? BPL MUSEN1 ; nein, nochmal --> ; ; LDA #3 ; Pokey ruecksetzen STA SKCTL LDA #$0 ; Sound-Kontrollreg. zurueck STA AUDCTL ; LDX #$00 ; Setzen der einzelnen Zeiger LDA #STIMM1 ; Entspricht ein Rücksetzen STA STMTBH,X ; der Musik INX LDA #STIMM2 STA STMTBH,X
INX LDA #STIMM3 STA STMTBH,X
INX LDA #STIMM4 STA STMTBH,X
; RTS ; ;******* ; VBI ausschalten ; Vektor wird auf alten Wert zurueckgesetzt ;******* ; MUSAUS LDA #0 ; Sound aus! LDX #3 ; alle 4 Kanaele MUSAU1 STA AUDF1,X ; AUDF/C 1/2 STA AUDF1+4,X ; AUDF/C 3/4 DEX ; schon alle 4? BPL MUSAU1 ; nein, nochmal --> MUXPEN RTS ; ;******* ;Einen Kanal spielen ;pruefen der Tondauer, evtl. neue Note besorgen, ;Test auf ENDE, START, PAUSE ;******* ; MUXPLY LDA MUDUR1,X ; ist Kanal noch aktiv? BEQ MUXNEU ; nein, dann neue Note ; DEC MUDUR1,X ; sonst nur Tondauer - 1 BNE MUXPEN ; Ton laeuft noch ---> ; MUXNEU LDA #0 ; Flag fuer Pause vorerst STA MUPAU1,X ; zuruecknehmen STA MUHPT1,X ; Huellk. Zeiger auf Anf. LDA STMTBL,X ; Basisadresse der Noten STA CSREGL ; tabelle in Zeropage LDA STMTBH,X ; register umspeichern STA CSREGH ; LDY #0 ; Zeiger in Notentabelle LDA (CSREGL),Y ; Tonhoehe der Note CMP #START ; ist START-Befehl? BNE MUXN1 ; nein ---> ;
JSR MUSINI LDX #$00
JMP MUXNEU ; MUXN1 CMP #ENDE ; ist ENDE-Befehl? BEQ MUXPAU ; ja, dann Pause imitieren --> ; CMP #HUELLKURVE ; Huellkruve wechseln?
BNE MUXN2 LDY #$01
LDA (CSREGL),Y ; gewünschte Kurve lesen STA MUHUELL,X ; und setzen JSR MUXNXT JMP MUXNEU

;

MUXN2 PHA ; Tonhoehe merken LDY #$01
LDA (CSREGL),Y ; Dauer aus Notentabelle lesen STA MUDUR1,X ; in Zaehler f. Notendauer

  JSR MUXNXT
;
  PLA       ; Tonhoehe wieder holen
  CMP #PAUSE      ; war es ein PAUSE Befehl?
  BEQ MUXPAU      ; ja ,dann Pausenbearbeitung
;
  STA STTON,X
  RTS
;

MUXPAU LDA #PAUSE ; Huellk. ausschalten STA MUPAU1,X RTS ;
MUXNXT CLC LDA STMTBL,X ; Noten Zeiger auf ADC #$02 ; naechste Note richten STA STMTBL,X ; und abspeichern LDA STMTBH,X
ADC #$00 STA STMTBH,X
RTS
; ;******* ; Huellkurvengenerator ; Lautstaerke fuer einen Kanal wird gemaess ; Huellkurve eingestellt ;******* ; MUXHUL LDA MUPAU1,X ; Flag fuer Pause? CMP #PAUSE ; ist auf Pause? BNE MUXH1 ; nein, normale Huellk. ; LDA #0 ; Pause Lautstaerke auf Null STA STDIS,X ; Lautst. merken BEQ MUXHEN ; (immer!) an Pokey --> ; MUXH1 LDA MUHUELL,X TAX LDA MHLTBL,X ; Huellkurven Basisadresse STA CSREGL ; in Zeropage Register LDA MHLTBH,X ; MSB STA CSREGH LDX MUKANAL LDY MUHPT1,X ; aktueller Zeiger in Hk. LDA (CSREGL),Y ; neuer Stuetzpunkt CMP #ENDE ; ist Huellk. zu Ende? BEQ MUXHEN ; ja, dann fertig! STA STDIS,X

MUDIS INY LDA (CSREGL),Y ; CMD = 0 BNE MUXH2 INY CLC LDA STTON,X ADC (CSREGL),Y STA STTON,X JMP MUXHNX

MUXH2 CMP #$01 BNE MUXH3 INY LDA (CSREGL),Y STA STTON,X JMP MUXHNX

MUXH3 INY ; Stuetzpunkt merken MUXHNX INY ; HK-Zeiger weiterschalten TYA ; und abspeichern STA MUHPT1,X

MUXHEN RTS

MUPLAY TXA ; Offset fuer Pokey-Register ASL ; A Index mal 2 TAY LDA STTON,X STA AUDF1,Y LDA STDIS,X STA AUDC1,Y ; an POKEY geben

  RTS

;
;**************************************************
;Tabellen der Basisadressen fuer Noten2530 ;und Huellkurven Tabellen.
;**************************************************
;

STTON .BYTE $00,$00,$00,$00 ; Speicher für Tonhöhe STDIS .BYTE $00,$00,$00,$00 ; Speicher für Lautstärke/Verzerrung MUDUR1 .BYTE $00,$00,$00,$00 ; Zaehler fuer Tondauer MUPAU1 .BYTE $00,$00,$00,$00 ; Flag fuer Pause MUHPT1 .BYTE $00,$00,$00,$00 ; Zeiger in Huellkurve MUHUELL .BYTE $00,$01,$02,$03 ; Zeiger auf verwendete Huellkruve MUKANAL .BYTE $00 ; Aktueller Kanal

STMTBL .BYTE STIMM1,>STIMM2,>STIMM3,>STIMM4

MHLTBL .BYTE HUELL0,>HUELL1,>HUELL2,>HUELL3,>HUELL4

;
;**************************************************
;Notentabellen:
;jede Tabelle beginnt mit Label STIMM<n>
;wobei <n>:Nummer der Stimme (1-4)
;danach folgen die Noten (Note,Dauer)
;jeweils in .BYTE Befehlen.
;nach letzter Note muss 'ENDE' oder
;'START' eingetragen werden.
;**************************************************
;

STIMM1 ;.BYTE P,V,ENDE .BYTE K,0 .BYTE P,V,P,V,P,V,P,V .BYTE $72,Q,P,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $80,Q,$72,Q,P,H .BYTE P,V .BYTE $72,Q,P,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $80,Q,$99,Q,P,H .BYTE P,V .BYTE $72,Q,P,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE P,Q,$72,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $60,Q,$72,Q,P,H .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $80,Q,$72,Q,P,H .BYTE P,V .BYTE $72,Q,P,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $80,Q,$72,Q,P,E,K,1,$40,Q,P,E ; Kurven Änderung .BYTE $44,Q,P,E,$48,Q,P,E,$4c,Q,K,0 .BYTE $72,Q,P,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $80,Q,$99,Q,P,E,K,1,$3c,Q,P,E ; Kurven Änderung .BYTE $40,Q,P,E,$44,Q,P,E,$48,Q,K,0 .BYTE $72,Q,P,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE P,Q,$72,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $60,Q,$72,Q,P,H .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $80,Q,$72,Q,P,E,K,1,$72,Q,P,E ; Kurven Änderung .BYTE $72,Q,P,E,$72,Q,P,E,$72,Q,K,0 .BYTE $72,Q,P,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE P,Q,$72,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $60,Q,$72,Q,P,H .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $80,Q,$72,Q,P,H .BYTE P,V,P,V,P,V,P,V,P,V .BYTE START

STIMM2 ;.BYTE P,V,ENDE .BYTE K,1 .byte P,V,P,V,P,V,P,V,P,V,P,V,P,V,P,V .byte P,V,P,V,P,V,P,V,P,V,P,V,P,V,P,V .byte P,V,P,V,P,V,P,V .byte P,V,P,V,P,H,P,E,$72,Q,P,E,$72,Q,P,E,$72,Q,P,E,$72,Q .byte P,V,P,V,P,H,P,E,$32,Q,P,E,$32,Q,P,E,$32,Q,P,E,$32,Q .byte P,V,P,V,P,V,P,V .byte P,V,P,V,P,H,P,E,$40,Q,P,E,$44,Q,P,E,$48,Q,P,E,$4c,Q .BYTE ENDE

STIMM3 ;.BYTE P,V,ENDE .BYTE K,2 .byte $b6,E,$ce,E,$f2,E,$b6,Q,$f2,E,$ce,E,$f2,E,$b6,E .byte $ce,E,$f2,E,$b6,Q,$f2,E,$ce,E,$f2,E,$b6,E,$ce,E .byte $f2,E,$b6,Q,$f2,E,$ce,E,$f2,E,$b6,E,$ce,E,$f2,E .byte $b6,Q,$f2,E,$ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$b6,Q .byte $f2,E,$ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$b6,Q,$f2,E .byte $ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$b6,Q,$f2,E,$ce,E .byte $f2,E,$b6,E,$ce,E,$f2,E,$b6,Q,$f2,E,$ce,E,$f2,E .byte $b6,E,$ce,E,$f2,E,$b6,Q,$f2,E,$ce,E,$f2,E,$b6,E .byte $ce,E,$f2,E,$b6,Q,$f2,E,$ce,E,$f2,E,$a1,E,$bf,E .byte $f2,E,$a1,Q,$f2,E,$b6,E,$f2,E,$a1,E,$bf,E,$f2,E .byte $a1,Q,$f2,E,$b6,E,$f2,E,$b6,E,$ce,E,$f2,E,$b6,Q .byte $f2,E,$ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$b6,Q,$f2,E .byte $ce,E,$b6,E,$71,E,$80,E,$98,E,$e6,Q,$98,E,$80,E .byte $98,E,$71,E,$80,E,$98,E,$b6,Q,$98,E,$80,E,$98,E .byte $b6,E,$ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$ce,E,$f2,E .byte $80,Q,$98,E,$89,Q,$98,E,$b6,Q,$b6,E,$ce,E,$f2,E .byte $b6,Q,$f2,E,$ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$b6,E .byte $ce,E,$f2,E,$ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$b6,Q .byte $f2,E,$ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$b6,Q,$f2,E .byte $ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$b6,Q,$f2,E,$ce,E .byte $f2,E,$b6,E,$ce,E,$f2,E,$b6,Q,$f2,E,$ce,E,$f2,E .byte $b6,E,$ce,E,$f2,E,$b6,Q,$f2,E,$ce,E,$f2,E,$b6,E .byte $ce,E,$f2,E,$b6,Q,$f2,E,$ce,E,$f2,E,$a1,E,$bf,E .byte $f2,E,$a1,Q,$f2,E,$bf,E,$f2,E,$a1,E,$bf,E,$f2,E .byte $a1,Q,$f2,E,$ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$b6,Q .byte $f2,E,$ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$b6,Q,$f2,E .byte $ce,E,$b6,E,$71,E,$80,E,$98,E,$e6,Q,$98,E,$80,E .byte $98,E,$6b,E,$80,E,$98,E,$bf,Q,$98,E,$80,E,$98,E .byte $bf,E,$ce,E,$f2,E,$bf,E,$ce,E,$f2,E,$ce,E,$f2,E .byte $80,Q,$98,E,$89,Q,$98,E,$b6,Q,$b6,E,$ce,E,$f2,E .byte $b6,Q,$f2,E,$ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$b6,E .byte $ce,E,$f2,E,$ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$b6,Q .byte $f2,E,$ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$b6,Q,$f2,E .byte $ce,E,$b6,E,$71,E,$80,E,$98,E,$e6,Q,$98,E,$80,E .byte $98,E,$6b,E,$80,E,$98,E,$b6,Q,$98,E,$80,E,$98,E .byte $b6,E,$ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$ce,E,$f2,E .byte $80,Q,$98,E,$89,Q,$98,E,$b6,Q,$ce,Q,$b6,Q
.BYTE ENDE

STIMM4 ;.BYTE P,V,ENDE .byte K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q .byte K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q .byte K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E .byte K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E .byte K,4,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q .byte K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q .byte K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q .byte K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E .byte K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E .byte K,4,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q .byte K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q .byte K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q .byte K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E .byte K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E .byte K,4,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q .byte K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q .byte K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q .byte K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E .byte K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E .byte K,4,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q .byte K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q .byte K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q .byte K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E .byte K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E .byte K,4,$f3,Q,K,3,$b5,E,K,4,$f3,Q,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q .byte K,3,$5b,Q,$79,E,$79,Q,$5b,E,$79,Q,$79,Q,$79,E,$79,Q,$79,E,$79,Q,$79,Q,$79,Q
.BYTE ENDE

; wird im Beispiel nicht benutzt
;
;**************************************************
; HUELLKURVENTABELLEN
; Hier werden Stuetzpunkte der Huellkurven
; als Lautstaerkewerte eingetragen
; jede Tabelle beginnt mit HUELL<n>
; und endet mit 'ENDE'
;**************************************************
;
; Erster Wert ist die Verzerrung und die Lautstärke
; Der zweite Wert gibt an, was mit dem Dritten Wert
; gemacht werden soll
; $00   = Dritten Wert zur Frequenz addieren
; $01 = Dritter Wert überschreibt die Frequenz

HUELL0 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $00,$00,$00 .BYTE ENDE

HUELL1 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $00,$00,$00 .BYTE ENDE

HUELL2 .BYTE $C6,$00,$00 .BYTE $C8,$00,$00 .BYTE $C8,$00,$00 .BYTE $C6,$00,$00 .BYTE $C6,$00,$00 .BYTE $C4,$00,$00 .BYTE $C4,$00,$00 .BYTE $C3,$00,$00 .BYTE $C3,$00,$00 .BYTE $00,$00,$00 .BYTE ENDE

HUELL3 .BYTE $88,$00,$00 .BYTE $87,$00,$00 .BYTE $84,$00,$00 .BYTE $82,$00,$00 .BYTE $00,$00,$00 .BYTE ENDE

HUELL4 .BYTE $88,$01,$00 .BYTE $86,$01,$01 .BYTE $A2,$01,$02 .BYTE $00,$01,$00 .BYTE ENDE

  .end
Antworten

Hallo!

Ja richtig. Im Demo nutze ich nicht den VBI. Aber man kann den Aufruf einfach in den VBI integrieren. Nur vorher unbedingt einmal Initialisieren! Du kannst den Code 1:1 gerne in Phobos nutzen, musst halt nur die Musikdaten austauschen. Bin gespannt, wie sich Deine Musik anhören wird :mrgreen:

Ich selbst überlege noch ein Loop-Kommando im Player einzubauen, damit man eine sich mehrmals wiederholende Sequenz nur einmal (oder weniger oft) hinterlegen muss.

Sollte dann so aussehen:

.BYTE L,0 ; Adresse merken .BYTE x,y,x,y,x,y .BYTE L,3 ; Loop 3x durchführen

Antworten

Hier nun mit Loop.

Gesamtlänge von 2175 Bytes auf 1308 Bytes gesunken :-)

  org $2000

  icl 'Systemkonstanten.asm'

  .proc main

  jsr TitelMusik.MUSINI

?mainloop lda RTCLOK+2 ?loop cmp RTCLOK+2
beq ?loop

        jsr TitelMusik.MUSPLAY  ; Muss alle 1/50 Sekunde aufgerufen werden (z.B. im VBI)

        jmp ?mainloop

        .end

        run main

; ; ;************ ; Ab hier kommt die Musikroutine, die man einbinden kann ; ;** .proc TitelMusik

PAUSE EQU $ff ; Code f. Pause P EQU PAUSE ; Kuerzel f. Pause START EQU $fe ; Code fuer Musik-Neubeginn ENDE EQU $fd ; Code fuer Stimmende HUELLKURVE EQU $fc ; Code fuer Huellkurve K EQU HUELLKURVE ; Kuerzel f. Huellkruve LOOP EQU $fb ; Code für einen Loop L EQU LOOP ; Kuerzel f. Loop ; DAUER EQU 4 ; Dauer eines 16tel ; V EQU DAUER16 ; H EQU DAUER8 ; Halbe Note Q EQU DAUER4 ; Viertel Note (Quarter) E EQU DAUER2 ; Achtel Note (Eight) S EQU DAUER ; Sechzehntel Note ; ;******* ; Interne Variablen fuer MUSIK ;******* ;

CSREGL EQU $CE ; Zeropageregister CSREGH EQU $CF

;**************************************************
; VBI-Routine, alle 1/50sec. aufgerufen
;**************************************************
;

MUSPLAY LDX #0 ; Kanal 0 zuerst spielen MUNXKN STX MUKANAL ; Kanal merken JSR MUXPLY ; Ton für Stimme holen JSR MUXHUL ; Huellkurve f. eine Stimme holen JSR MUPLAY ; Ton/Huellkruve spielen INX ; naechste Stimme CPX #4 ; schon alle 4 Stimmen? BNE MUNXKN ; nein --> ; RTS ; ;******* ; Initialisierungsroutine ; POKEY init., Variable loeschen, VBI setzen ;******* ; MUSINI LDA #0 ; POKEY und Variablen loeschen LDX #3 ; je 4 Register ; MUSEN1 STA AUDF1,X ; AUDF/C 1/2 STA AUDF1+4,X ; AUDF/C 3/4 STA MUDUR1,X ; Tondauer:=0 STA MUHPT1,X ; Huellk.-Zeiger:=Tabellenanfang DEX ; schon alle 4? BPL MUSEN1 ; nein, nochmal --> ; ; LDA #3 ; Pokey ruecksetzen STA SKCTL LDA #$0 ; Sound-Kontrollreg. zurueck STA AUDCTL ; LDX #$00 ; Setzen der einzelnen Zeiger LDA #STIMM1 ; Entspricht ein Rücksetzen STA STMTBH,X ; der Musik INX LDA #STIMM2 STA STMTBH,X
INX LDA #STIMM3 STA STMTBH,X
INX LDA #STIMM4 STA STMTBH,X
; RTS ; ;******* ; VBI ausschalten ; Vektor wird auf alten Wert zurueckgesetzt ;******* ; MUSAUS LDA #0 ; Sound aus! LDX #3 ; alle 4 Kanaele MUSAU1 STA AUDF1,X ; AUDF/C 1/2 STA AUDF1+4,X ; AUDF/C 3/4 DEX ; schon alle 4? BPL MUSAU1 ; nein, nochmal --> MUXPEN RTS ; ;******* ;Einen Kanal spielen ;pruefen der Tondauer, evtl. neue Note besorgen, ;Test auf ENDE, START, PAUSE ;******* ; MUXPLY LDA MUDUR1,X ; ist Kanal noch aktiv? BEQ MUXNEU ; nein, dann neue Note ; DEC MUDUR1,X ; sonst nur Tondauer - 1 BNE MUXPEN ; Ton laeuft noch ---> ; MUXNEU LDA #0 ; Flag fuer Pause vorerst STA MUPAU1,X ; zuruecknehmen STA MUHPT1,X ; Huellk. Zeiger auf Anf. LDA STMTBL,X ; Basisadresse der Noten STA CSREGL ; tabelle in Zeropage LDA STMTBH,X ; register umspeichern STA CSREGH ; LDY #0 ; Zeiger in Notentabelle LDA (CSREGL),Y ; Tonhoehe der Note ;
CMP #START ; ist START-Befehl? BNE MUXN1 ; nein ---> JSR MUSINI LDX #$00
JMP MUXNEU ; MUXN1 CMP #ENDE ; ist ENDE-Befehl? BEQ MUXPAU ; ja, dann Pause imitieren --> ; CMP #LOOP ; Loop? BNE MUXN2 ; Nein, dann weiter MUXN2 JMP MULOOP ; MUXN2 CMP #HUELLKURVE ; Huellkruve wechseln?
BNE MUXN3 LDY #$01
LDA (CSREGL),Y ; gewünschte Kurve lesen STA MUHUELL,X ; und setzen JSR MUXNXT JMP MUXNEU

;

MUXN3 PHA ; Tonhoehe merken LDY #$01
LDA (CSREGL),Y ; Dauer aus Notentabelle lesen STA MUDUR1,X ; in Zaehler f. Notendauer

  JSR MUXNXT
;
  PLA       ; Tonhoehe wieder holen
  CMP #PAUSE      ; war es ein PAUSE Befehl?
  BEQ MUXPAU      ; ja ,dann Pausenbearbeitung
;
  STA STTON,X
  RTS
;

MUXPAU LDA #PAUSE ; Huellk. ausschalten STA MUPAU1,X RTS ;
MUXNXT CLC LDA STMTBL,X ; Noten Zeiger auf ADC #$02 ; naechste Note richten STA STMTBL,X ; und abspeichern LDA STMTBH,X
ADC #$00 STA STMTBH,X
RTS

MULOOP LDY #$01
LDA (CSREGL),Y ; zweites Byte lesen BNE MULOOP1 ; = 0? Dann weiter DEC MULOOPCNT,X LDA MULOOPCNT,X BNE @+ ; Zähler ungleich 0 -> @ JSR MUXNXT ; nächste Note holen JMP MUXNEU ; und abspielen

@ LDA MULOOPADRL,X ; gemerkte Adresse STA STMTBL,X ; holen und abspielen LDA MULOOPADRH,X STA STMTBH,X
JMP MUXNEU ; Neue Adresse abspielen

MULOOP1 STA MULOOPCNT,X ; Loop-Zähler setzen JSR MUXNXT ; Adresszähler erhöhen LDA STMTBL,X ; holen und abspielen STA MULOOPADRL,X ; gemerkte Adresse LDA STMTBH,X
STA MULOOPADRH,X JMP MUXNEU ; Nächste Note holen und abspielen

;
;**************************************************
; Huellkurvengenerator
; Lautstaerke fuer einen Kanal wird gemaess
; Huellkurve eingestellt
;**************************************************
;

MUXHUL LDA MUPAU1,X ; Flag fuer Pause? CMP #PAUSE ; ist auf Pause? BNE MUXH1 ; nein, normale Huellk. ; LDA #0 ; Pause Lautstaerke auf Null STA STDIS,X ; Lautst. merken BEQ MUXHEN ; (immer!) an Pokey --> ; MUXH1 LDA MUHUELL,X TAX LDA MHLTBL,X ; Huellkurven Basisadresse STA CSREGL ; in Zeropage Register LDA MHLTBH,X ; MSB STA CSREGH LDX MUKANAL LDY MUHPT1,X ; aktueller Zeiger in Hk. LDA (CSREGL),Y ; neuer Stuetzpunkt CMP #ENDE ; ist Huellk. zu Ende? BEQ MUXHEN ; ja, dann fertig! STA STDIS,X

MUDIS INY LDA (CSREGL),Y ; CMD = 0 BNE MUXH2 INY CLC LDA STTON,X ADC (CSREGL),Y STA STTON,X JMP MUXHNX

MUXH2 CMP #$01 BNE MUXH3 INY LDA (CSREGL),Y STA STTON,X JMP MUXHNX

MUXH3 INY ; Stuetzpunkt merken MUXHNX INY ; HK-Zeiger weiterschalten TYA ; und abspeichern STA MUHPT1,X

MUXHEN RTS

MUPLAY TXA ; Offset fuer Pokey-Register ASL ; A Index mal 2 TAY LDA STTON,X STA AUDF1,Y LDA STDIS,X STA AUDC1,Y ; an POKEY geben

  RTS

;
;**************************************************
;Tabellen der Basisadressen fuer Noten2530 ;und Huellkurven Tabellen.
;**************************************************
;

STTON .BYTE $00,$00,$00,$00 ; Speicher für Tonhöhe STDIS .BYTE $00,$00,$00,$00 ; Speicher für Lautstärke/Verzerrung MUDUR1 .BYTE $00,$00,$00,$00 ; Zaehler fuer Tondauer MUPAU1 .BYTE $00,$00,$00,$00 ; Flag fuer Pause MUHPT1 .BYTE $00,$00,$00,$00 ; Zeiger in Huellkurve MUHUELL .BYTE $00,$01,$02,$03 ; Zeiger auf verwendete Huellkruve MULOOPADRL .BYTE $00,$00,$00,$00 ; Loop-Addr LO merken MULOOPADRH .BYTE $00,$00,$00,$00 ; Loop-Addr HI merken MULOOPCNT .BYTE $00,$00,$00,$00 ; Loop-Zähler MUKANAL .BYTE $00 ; Aktueller Kanal

STMTBL .BYTE STIMM1,>STIMM2,>STIMM3,>STIMM4

MHLTBL .BYTE HUELL0,>HUELL1,>HUELL2,>HUELL3,>HUELL4

;
;***************************************************
;Notentabellen:
;jede Tabelle beginnt mit Label STIMM<n>
;wobei <n>:Nummer der Stimme (1-4)
;danach folgen die Noten (Note,Dauer)
;jeweils in .BYTE Befehlen.
;nach letzter Note muss 'ENDE' oder
;'START' eingetragen werden.
;'START' startet die gesamte Melodie neu!
;
;Man kann mit K,1 die Hüllkurve 1 auswählen
;Mit L,8 ..... L,0 kann man die Noten 8x wiederholen
;***************************************************
;

STIMM1 ;.BYTE P,V,ENDE .BYTE K,0 .BYTE L,4,P,V,L,0 ; Loop .BYTE $72,Q,P,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $80,Q,$72,Q,P,H .BYTE P,V .BYTE $72,Q,P,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $80,Q,$99,Q,P,H .BYTE P,V .BYTE $72,Q,P,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE P,Q,$72,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $60,Q,$72,Q,P,H .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $80,Q,$72,Q,P,H .BYTE P,V .BYTE $72,Q,P,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $80,Q,$72,Q,P,E,K,1,$40,Q,P,E ; Kurven Änderung .BYTE $44,Q,P,E,$48,Q,P,E,$4c,Q,K,0 .BYTE $72,Q,P,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $80,Q,$99,Q,P,E,K,1,$3c,Q,P,E ; Kurven Änderung .BYTE $40,Q,P,E,$44,Q,P,E,$48,Q,K,0 .BYTE $72,Q,P,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE P,Q,$72,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $60,Q,$72,Q,P,H .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $80,Q,$72,Q,P,E,K,1,$72,Q,P,E ; Kurven Änderung .BYTE $72,Q,P,E,$72,Q,P,E,$72,Q,K,0 .BYTE $72,Q,P,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE P,Q,$72,Q,$60,Q,P,Q .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $60,Q,$72,Q,P,H .BYTE $51,Q,$60,E,$55,Q,$60,E,$72,Q .BYTE $80,Q,$72,Q,P,H .BYTE P,V,P,V,P,V,P,V,P,V .BYTE START

STIMM2 ;.BYTE P,V,ENDE .byte K,1 .byte L,22,P,V,L,0 ; Loop .byte P,H,P,E,$72,Q,P,E,$72,Q,P,E,$72,Q,P,E,$72,Q .byte P,V,P,V,P,H,P,E,$32,Q,P,E,$32,Q,P,E,$32,Q,P,E,$32,Q .byte L,6,P,V,L,0 .byte P,H,P,E,$40,Q,P,E,$44,Q,P,E,$48,Q,P,E,$4c,Q .byte ENDE

STIMM3 ;.BYTE P,V,ENDE .BYTE K,2 .byte L,10,$b6,E,$ce,E,$f2,E,$b6,Q,$f2,E,$ce,E,$f2,E,L,0 ; Loop .byte $a1,E,$bf,E .byte $f2,E,$a1,Q,$f2,E,$b6,E,$f2,E,$a1,E,$bf,E .byte $f2,E,$a1,Q,$f2,E,$b6,E,$f2,E .byte $b6,E,$ce,E,$f2,E,$b6,Q,$f2,E,$ce,E,$f2,E .byte $b6,E,$ce,E,$f2,E,$b6,Q,$f2,E,$ce,E,$b6,E .byte $71,E,$80,E,$98,E,$e6,Q,$98,E,$80,E,$98,E .byte $71,E,$80,E,$98,E,$b6,Q,$98,E,$80,E,$98,E .byte $b6,E,$ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$ce,E .byte $f2,E,$80,Q,$98,E,$89,Q,$98,E,$b6,Q,$b6,E .byte $ce,E,$f2,E,$b6,Q,$f2,E,$ce,E,$f2,E,$b6,E .byte $ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$ce,E,$f2,E .byte L,6,$b6,E,$ce,E,$f2,E,$b6,Q,$f2,E,$ce,E,$f2,E,L,0 ; Loop .byte $a1,E,$bf,E,$f2,E,$a1,Q,$f2,E,$bf,E,$f2,E .byte $a1,E,$bf,E,$f2,E,$a1,Q,$f2,E,$ce,E,$f2,E .byte $b6,E,$ce,E,$f2,E,$b6,Q,$f2,E,$ce,E,$f2,E .byte $b6,E,$ce,E,$f2,E,$b6,Q,$f2,E,$ce,E .byte $b6,E,$71,E,$80,E,$98,E,$e6,Q,$98,E,$80,E .byte $98,E,$6b,E,$80,E,$98,E,$bf,Q,$98,E,$80,E .byte $98,E,$bf,E,$ce,E,$f2,E,$bf,E,$ce,E,$f2,E .byte $ce,E,$f2,E,$80,Q,$98,E,$89,Q,$98,E,$b6,Q .byte $b6,E,$ce,E,$f2,E,$b6,Q,$f2,E,$ce,E,$f2,E .byte $b6,E,$ce,E,$f2,E,$b6,E,$ce,E,$f2,E,$ce,E .byte $f2,E,$b6,E,$ce,E,$f2,E,$b6,Q,$f2,E,$ce,E .byte $f2,E,$b6,E,$ce,E,$f2,E,$b6,Q,$f2,E,$ce,E .byte $b6,E,$71,E,$80,E,$98,E,$e6,Q,$98,E,$80,E .byte $98,E,$6b,E,$80,E,$98,E,$b6,Q,$98,E,$80,E .byte $98,E,$b6,E,$ce,E,$f2,E,$b6,E,$ce,E,$f2,E .byte $ce,E,$f2,E,$80,Q,$98,E,$89,Q,$98,E,$b6,Q .byte $ce,Q,$b6,Q
.BYTE ENDE

STIMM4 ;.BYTE P,V,ENDE .byte L,40,K,3,$b5,Q,K,4,$f3,E,$f3,Q,K,3,$b5,E,K,4,$f3,Q,L,0 .byte K,3,$5b,Q,$79,E,$79,Q,$5b,E,$79,Q,$79,Q,$79,E,$79,Q,$79,E,$79,Q,$79,Q,$79,Q
.BYTE ENDE

;**************************************************
; HUELLKURVENTABELLEN
; Hier werden Stuetzpunkte der Huellkurven
; als Lautstaerkewerte eingetragen
; jede Tabelle beginnt mit HUELL<n>
; und endet mit 'ENDE'
;**************************************************
;
; Erster Wert ist die Verzerrung und die Lautstärke
; Der zweite Wert gibt an, was mit dem Dritten Wert
; gemacht werden soll
; $00   = Dritten Wert zur Frequenz addieren
; $01 = Dritter Wert überschreibt die Frequenz

HUELL0 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $00,$00,$00 .BYTE ENDE

HUELL1 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $00,$00,$00 .BYTE ENDE

HUELL2 .BYTE $C6,$00,$00 .BYTE $C8,$00,$00 .BYTE $C8,$00,$00 .BYTE $C6,$00,$00 .BYTE $C6,$00,$00 .BYTE $C4,$00,$00 .BYTE $C4,$00,$00 .BYTE $C3,$00,$00 .BYTE $C3,$00,$00 .BYTE $00,$00,$00 .BYTE ENDE

HUELL3 .BYTE $88,$00,$00 .BYTE $87,$00,$00 .BYTE $84,$00,$00 .BYTE $82,$00,$00 .BYTE $00,$00,$00 .BYTE ENDE

HUELL4 .BYTE $88,$01,$00 .BYTE $86,$01,$01 .BYTE $A2,$01,$02 .BYTE $00,$01,$00 .BYTE ENDE

  .end
Antworten

Hallo Peter,

ich habe mal die ersten 8 Takte für Dich umgesetzt. Lösch einfach diese Nachricht, wenn Du es lieber komplett alleine machen möchtest, was ich gut verstehen würde.

Ich habe das jetzt nur gemacht, weil Du Dir so viele Gedanken wegen Rhythmus und so gemacht hast, dass ich dachte, es hilft Dir vielleicht ein wenig.

Es klingt schon recht ähnlich, aber 100% schaff ich leider auch nicht.

  org $2000

  icl 'Systemkonstanten.asm'

  .proc main

  jsr TitelMusik.MUSINI

?mainloop lda RTCLOK+2 ?loop cmp RTCLOK+2
beq ?loop

        jsr TitelMusik.MUSPLAY  ; Muss alle 1/50 Sekunde aufgerufen werden (z.B. im VBI)

        jmp ?mainloop

        .end

        run main

; ; ;************ ; Ab hier kommt die Musikroutine, die man einbinden kann ; ;** .proc TitelMusik

PAUSE EQU $ff ; Code f. Pause P EQU PAUSE ; Kuerzel f. Pause START EQU $fe ; Code fuer Musik-Neubeginn ENDE EQU $fd ; Code fuer Stimmende HUELLKURVE EQU $fc ; Code fuer Huellkurve K EQU HUELLKURVE ; Kuerzel f. Huellkruve LOOP EQU $fb ; Code für einen Loop L EQU LOOP ; Kuerzel f. Loop ; DAUER EQU 7 ; Dauer eines 16tel ; V EQU DAUER16 ; H EQU DAUER8 ; Halbe Note Q EQU DAUER4 ; Viertel Note (Quarter) E EQU DAUER2 ; Achtel Note (Eight) S EQU DAUER ; Sechzehntel Note ; ;******* ; Interne Variablen fuer MUSIK ;******* ;

CSREGL EQU $CE ; Zeropageregister CSREGH EQU $CF

;**************************************************
; VBI-Routine, alle 1/50sec. aufgerufen
;**************************************************
;

MUSPLAY LDX #0 ; Kanal 0 zuerst spielen MUNXKN STX MUKANAL ; Kanal merken JSR MUXPLY ; Ton für Stimme holen JSR MUXHUL ; Huellkurve f. eine Stimme holen JSR MUPLAY ; Ton/Huellkruve spielen INX ; naechste Stimme CPX #4 ; schon alle 4 Stimmen? BNE MUNXKN ; nein --> ; RTS ; ;******* ; Initialisierungsroutine ; POKEY init., Variable loeschen, VBI setzen ;******* ; MUSINI LDA #0 ; POKEY und Variablen loeschen LDX #3 ; je 4 Register ; MUSEN1 STA AUDF1,X ; AUDF/C 1/2 STA AUDF1+4,X ; AUDF/C 3/4 STA MUDUR1,X ; Tondauer:=0 STA MUHPT1,X ; Huellk.-Zeiger:=Tabellenanfang DEX ; schon alle 4? BPL MUSEN1 ; nein, nochmal --> ; ; LDA #3 ; Pokey ruecksetzen STA SKCTL LDA #$0 ; Sound-Kontrollreg. zurueck STA AUDCTL ; LDX #$00 ; Setzen der einzelnen Zeiger LDA #STIMM1 ; Entspricht ein Rücksetzen STA STMTBH,X ; der Musik INX LDA #STIMM2 STA STMTBH,X
INX LDA #STIMM3 STA STMTBH,X
INX LDA #STIMM4 STA STMTBH,X
; RTS ; ;******* ; VBI ausschalten ; Vektor wird auf alten Wert zurueckgesetzt ;******* ; MUSAUS LDA #0 ; Sound aus! LDX #3 ; alle 4 Kanaele MUSAU1 STA AUDF1,X ; AUDF/C 1/2 STA AUDF1+4,X ; AUDF/C 3/4 DEX ; schon alle 4? BPL MUSAU1 ; nein, nochmal --> MUXPEN RTS ; ;******* ;Einen Kanal spielen ;pruefen der Tondauer, evtl. neue Note besorgen, ;Test auf ENDE, START, PAUSE ;******* ; MUXPLY LDA MUDUR1,X ; ist Kanal noch aktiv? BEQ MUXNEU ; nein, dann neue Note ; DEC MUDUR1,X ; sonst nur Tondauer - 1 BNE MUXPEN ; Ton laeuft noch ---> ; MUXNEU LDA #0 ; Flag fuer Pause vorerst STA MUPAU1,X ; zuruecknehmen STA MUHPT1,X ; Huellk. Zeiger auf Anf. LDA STMTBL,X ; Basisadresse der Noten STA CSREGL ; tabelle in Zeropage LDA STMTBH,X ; register umspeichern STA CSREGH ; LDY #0 ; Zeiger in Notentabelle LDA (CSREGL),Y ; Tonhoehe der Note ;
CMP #START ; ist START-Befehl? BNE MUXN1 ; nein ---> JSR MUSINI LDX #$00
JMP MUXNEU ; MUXN1 CMP #ENDE ; ist ENDE-Befehl? BEQ MUXPAU ; ja, dann Pause imitieren --> ; CMP #LOOP ; Loop? BNE MUXN2 ; Nein, dann weiter MUXN2 JMP MULOOP ; MUXN2 CMP #HUELLKURVE ; Huellkruve wechseln?
BNE MUXN3 LDY #$01
LDA (CSREGL),Y ; gewünschte Kurve lesen STA MUHUELL,X ; und setzen JSR MUXNXT JMP MUXNEU

;

MUXN3 PHA ; Tonhoehe merken LDY #$01
LDA (CSREGL),Y ; Dauer aus Notentabelle lesen STA MUDUR1,X ; in Zaehler f. Notendauer

  JSR MUXNXT
;
  PLA       ; Tonhoehe wieder holen
  CMP #PAUSE      ; war es ein PAUSE Befehl?
  BEQ MUXPAU      ; ja ,dann Pausenbearbeitung
;
  STA STTON,X
  RTS
;

MUXPAU LDA #PAUSE ; Huellk. ausschalten STA MUPAU1,X RTS ;
MUXNXT CLC LDA STMTBL,X ; Noten Zeiger auf ADC #$02 ; naechste Note richten STA STMTBL,X ; und abspeichern LDA STMTBH,X
ADC #$00 STA STMTBH,X
RTS

MULOOP LDY #$01
LDA (CSREGL),Y ; zweites Byte lesen BNE MULOOP1 ; = 0? Dann weiter DEC MULOOPCNT,X LDA MULOOPCNT,X BNE @+ ; Zähler ungleich 0 -> @ JSR MUXNXT ; nächste Note holen JMP MUXNEU ; und abspielen

@ LDA MULOOPADRL,X ; gemerkte Adresse STA STMTBL,X ; holen und abspielen LDA MULOOPADRH,X STA STMTBH,X
JMP MUXNEU ; Neue Adresse abspielen

MULOOP1 STA MULOOPCNT,X ; Loop-Zähler setzen JSR MUXNXT ; Adresszähler erhöhen LDA STMTBL,X ; holen und abspielen STA MULOOPADRL,X ; gemerkte Adresse LDA STMTBH,X
STA MULOOPADRH,X JMP MUXNEU ; Nächste Note holen und abspielen

;
;**************************************************
; Huellkurvengenerator
; Lautstaerke fuer einen Kanal wird gemaess
; Huellkurve eingestellt
;**************************************************
;

MUXHUL LDA MUPAU1,X ; Flag fuer Pause? CMP #PAUSE ; ist auf Pause? BNE MUXH1 ; nein, normale Huellk. ; LDA #0 ; Pause Lautstaerke auf Null STA STDIS,X ; Lautst. merken BEQ MUXHEN ; (immer!) an Pokey --> ; MUXH1 LDA MUHUELL,X TAX LDA MHLTBL,X ; Huellkurven Basisadresse STA CSREGL ; in Zeropage Register LDA MHLTBH,X ; MSB STA CSREGH LDX MUKANAL LDY MUHPT1,X ; aktueller Zeiger in Hk. LDA (CSREGL),Y ; neuer Stuetzpunkt CMP #ENDE ; ist Huellk. zu Ende? BEQ MUXHEN ; ja, dann fertig! STA STDIS,X

MUDIS INY LDA (CSREGL),Y ; CMD = 0 BNE MUXH2 INY CLC LDA STTON,X ADC (CSREGL),Y STA STTON,X JMP MUXHNX

MUXH2 CMP #$01 BNE MUXH3 INY LDA (CSREGL),Y STA STTON,X JMP MUXHNX

MUXH3 INY ; Stuetzpunkt merken MUXHNX INY ; HK-Zeiger weiterschalten TYA ; und abspeichern STA MUHPT1,X

MUXHEN RTS

MUPLAY TXA ; Offset fuer Pokey-Register ASL ; A Index mal 2 TAY LDA STTON,X STA AUDF1,Y LDA STDIS,X STA AUDC1,Y ; an POKEY geben

  RTS

;
;**************************************************
;Tabellen der Basisadressen fuer Noten2530 ;und Huellkurven Tabellen.
;**************************************************
;

STTON .BYTE $00,$00,$00,$00 ; Speicher für Tonhöhe STDIS .BYTE $00,$00,$00,$00 ; Speicher für Lautstärke/Verzerrung MUDUR1 .BYTE $00,$00,$00,$00 ; Zaehler fuer Tondauer MUPAU1 .BYTE $00,$00,$00,$00 ; Flag fuer Pause MUHPT1 .BYTE $00,$00,$00,$00 ; Zeiger in Huellkurve MUHUELL .BYTE $00,$01,$02,$03 ; Zeiger auf verwendete Huellkruve MULOOPADRL .BYTE $00,$00,$00,$00 ; Loop-Addr LO merken MULOOPADRH .BYTE $00,$00,$00,$00 ; Loop-Addr HI merken MULOOPCNT .BYTE $00,$00,$00,$00 ; Loop-Zähler MUKANAL .BYTE $00 ; Aktueller Kanal

STMTBL .BYTE STIMM1,>STIMM2,>STIMM3,>STIMM4

MHLTBL .BYTE HUELL0,>HUELL1,>HUELL2,>HUELL3,>HUELL4

;
;***************************************************
;Notentabellen:
;jede Tabelle beginnt mit Label STIMM<n>
;wobei <n>:Nummer der Stimme (1-4)
;danach folgen die Noten (Note,Dauer)
;jeweils in .BYTE Befehlen.
;nach letzter Note muss 'ENDE' oder
;'START' eingetragen werden.
;'START' startet die gesamte Melodie neu!
;
;Man kann mit K,1 die Hüllkurve 1 auswählen
;Mit L,8 ..... L,0 kann man die Noten 8x wiederholen
;***************************************************
;

STIMM1 ;.BYTE P,V,ENDE .BYTE K,0 .byte L,4, P,V, L,0 .byte $51,S,P,S,$66,S,$5b,S,$51,H,P,Q .byte $4c,S,P,S,$60,S,$55,S,$4c,H,P,Q .byte $51,S,P,S,$66,S,$5b,S,$51,H,P,S,$66,S,$5b,S,$51,S .byte $4c,Q+E,$79,E,$80,E,$6c,Q+E .BYTE ENDE

STIMM2 .BYTE P,V,ENDE

STIMM3 ;.BYTE P,V,ENDE .BYTE K,2 .byte $5f,E,P,E,$5f,E,P,E,$5f,E,P,E,$5f,E,P,E .byte $5c,E,P,E,$5c,E,P,E,$5c,E,P,E,$5c,E,P,E .byte $5f,E,P,E,$5f,E,P,E,$5f,E,P,E,$5f,E,P,E .byte $56,E,P,E,$56,E,P,E,$3e,E,P,E,$80,E,P,E .byte $5f,E,P,E,$5f,E,P,E,$5f,E,P,E,$5f,E,P,E .byte $5c,E,P,E,$5c,E,P,E,$5c,E,P,E,$5c,E,P,E .byte $5f,E,P,E,$5f,E,P,E,$5f,E,P,E,$5f,E,P,E .byte $56,E,P,E,$56,E,P,E,$80,E,P,E,$80,E,P,E .BYTE ENDE

STIMM4 ;.BYTE P,V,ENDE .byte K,4 .byte L,3, $35,E, $35,E, $35,S, $35,S, $35,E, $35,E, $35,E, $35,S, $35,S, $35,E, L,0 .byte $35,E, $35,E, $35,S, $35,S, $35,E, $35,E, $35,S, $35,S, $35,S, $35,S, $35,E .byte L,3, $35,E, $35,E, $35,S, $35,S, $35,E, $35,E, $35,E, $35,S, $35,S, $35,E, L,0 .byte $35,E, $35,E, $35,S, $35,S, $35,E, $35,E, $35,S, $35,S, $35,S, $35,S, $35,S, $35,S .BYTE ENDE

;**************************************************
; HUELLKURVENTABELLEN
; Hier werden Stuetzpunkte der Huellkurven
; als Lautstaerkewerte eingetragen
; jede Tabelle beginnt mit HUELL<n>
; und endet mit 'ENDE'
;**************************************************
;
; Erster Wert ist die Verzerrung und die Lautstärke
; Der zweite Wert gibt an, was mit dem Dritten Wert
; gemacht werden soll
; $00   = Dritten Wert zur Frequenz addieren
; $01 = Dritter Wert überschreibt die Frequenz

HUELL0 .BYTE $A8,$00,$00 .BYTE ENDE

HUELL1 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $00,$00,$00 .BYTE ENDE

HUELL2 .BYTE $C8,$00,$00 .BYTE $C8,$00,$00 .BYTE $C8,$00,$00 .BYTE $C6,$00,$00 .BYTE $C6,$00,$00 .BYTE $C6,$00,$00 .BYTE $C6,$00,$00 .BYTE $C6,$00,$00 .BYTE $C4,$00,$00 .BYTE $C4,$00,$00 .BYTE $C4,$00,$00 .BYTE $C4,$00,$00 .BYTE $C3,$00,$00 .BYTE $C3,$00,$00 .BYTE $C3,$00,$00 .BYTE $C3,$00,$00 .BYTE $00,$00,$00 .BYTE ENDE

HUELL3 .BYTE $88,$00,$00 .BYTE $87,$00,$00 .BYTE $84,$00,$00 .BYTE $82,$00,$00 .BYTE $00,$00,$00 .BYTE ENDE

HUELL4 .BYTE $88,$01,$00 .BYTE $86,$01,$01 .BYTE $85,$01,$01 .BYTE $84,$01,$01 .BYTE $83,$01,$01 .BYTE $82,$01,$01 .BYTE $00,$01,$00 .BYTE ENDE

  .end

Den gesamten Code habe ich deshalb dargestellt, weil ich die Geschwindigkeit der Notenwerte verlangsamt habe "DAUER EQU 7".

Grüße Janko

Antworten

Moin!

Nehmen wir mal die diesen Code:

  .byte K,2
  .byte $5f,E,  P,E,  $5f,E,  P,E,  $5f,E,  P,E,  $5f,E,  P,E
  .byte ENDE

K = 2 bestimmt, dass die Hüllkurve Nr. 2 genommen wird. Das ist dann die Definition für die Lautstärke und die Verzerrung. Später mehr.

$5f = Notenwert E = Notenlänge

P = Notenwert (in dem Fall Pause) E = Notenlänge (in dem Fall Pausenlänge)

$5f = Notenwert E = Notenlänge ...

Es sind also immer Paare. 8 Paare da E eine Achtel-Note ist. 1/8 x 8 = 1 = ein voller Takt.

Die Hüllkurve 2 sieht wie folgt aus:

HUELL2 .BYTE $C8,$00,$00 .BYTE $C8,$00,$00 .BYTE $C8,$00,$00 .BYTE $C6,$00,$00 .BYTE $C6,$00,$00 .BYTE $C6,$00,$00 .BYTE $C6,$00,$00 .BYTE $C6,$00,$00 .BYTE $C4,$00,$00 .BYTE $C4,$00,$00 .BYTE $C4,$00,$00 .BYTE $C4,$00,$00 .BYTE $C3,$00,$00 .BYTE $C3,$00,$00 .BYTE $C3,$00,$00 .BYTE $C3,$00,$00 .BYTE $00,$00,$00 .BYTE ENDE

$C8 = Verzerrung C und Lautstärke 8 (alle 4 Stimmen dürfen beim ATARI zusammen nicht mehr als 32 ergeben!) $00,$00 = Kommando 0 mit Wert 0

Bei 0 wird der nächste Wert auf den Notenwert addiert. In dem Fall also keine Veränderung.

Das ist interessant, wenn Du eine Note vibrieren lassen will. Leider fehlt aktuell noch die Subtraktion :-)

Bei 1 wird der nächste Wert als Notenwert genommen. Die eigentliche Note wird also überschrieben.

Grüße Janko

Antworten

Hallo!

Für PM und Zeichensatz etc. nutze ich das MAD Studio: https://atariage.com/forums/topic/258728-mad-studio/ https://github.com/Gury8/Mad-Studio

Für den Sound, mein eigenes kleines Tool.

Mal eben ein Sound-Editor auf Windows zu programmieren wird keine kleine oder einfache Sache. Mit C# (Sharp) Builder habe ich mal vor 20 Jahren programmiert, dass bekomme ich heute nicht mehr so einfach hin :-) Thomas wollte uns ja eigentlich mal seinen PM-Editor geben, aber da ist leider nie etwas draus geworden. Ist aber ja auch alles auf Windows und nicht MAC.

Grüße Janko

Antworten

Hi!

Wenn man die Midi so bearbeiten kann, dass Du die Noten als Text ausgegeben bekommst (C4, D4 etc.), könntest Du Dir eine Menge Arbeit sparen. Schick mir bitte mal das Midi-File zu :-) Vielleicht kann ich da etwas erkennen.

Grüße Janko

Antworten

Hi!

Ich habe mein Script zum Konvertieren einer Midi -> Klartext fast fertig.

Dieser Code kam aktuell dabei heraus:

STIMM1 ;.BYTE P,V,ENDE .BYTE K,0 .byte P,V .byte P,V .byte P,V .byte P,V .byte $28,S,P,S,$32,S,$2d,S,$28,H,P,Q .byte $25,S,P,S,$2f,S,$2a,S,$25,H,P,Q .byte $28,S,P,S,$32,S,$2d,S,$28,H,P,S,$32,S,$2d,S,$28,S .byte $25,Q+E,$3c,E,$40,E,$35,Q+E .byte $28,S,P,S,$32,S,$2d,S,$28,H,P,Q .byte $25,S,P,S,$2f,S,$2a,S,$25,H,P,Q .byte $28,S,P,S,$32,S,$2d,S,$28,H,P,S,$32,S,$2d,S,$28,S .byte $25,Q+E,$3c,S,P,S,$40,Q,$28,E,P,E .byte $1d,H,$1f,H .byte $1d,S,P,S,$23,S,$1d,S,$1f,H+E+S,P,S .byte $1d,H,$1f,H .byte $23,S,$1f,S,$1d,S,P,S,$35,H+E+S,P,S .byte $28,S,P,S,$2f,S,$2d,S,$28,H,P,Q .byte $23,S,P,S,$2d,S,$28,S,$23,H,P,Q .byte $1d,S,P,S,$23,S,$1f,S,$1d,Q,P,E,$1a,Q,$1d,S,P,S .byte $1d,H+Q+E+S,P,S .byte $13,S,P,S,$18,S,$16,S,$13,H,P,Q .byte $12,S,P,S,$17,S,$14,S,$12,H,P,Q .byte $13,S,P,S,$18,S,$16,S,$13,H,P,S,$18,S,$16,S,$13,S .byte $12,Q+E,$1d,E,$1f,E,$1a,Q+E .byte $13,S,P,S,$18,S,$16,S,$13,H,P,Q .byte $12,S,P,S,$17,S,$14,S,$12,H,P,Q .byte $13,S,P,S,$18,S,$16,S,$13,H,P,S,$18,S,$16,S,$13,S .byte $12,Q+E,$1d,S,P,S,$1f,Q,$13,E,P,E .byte $1d,H,$1f,H .byte $1d,S,P,S,$23,S,$1d,S,$1f,H+E+S,P,S .byte $1d,H,$1f,H .byte $23,S,$1f,S,$1d,S,P,S,$35,H+E+S,P,S .byte $28,S,P,S,$2f,S,$2d,S,$28,H,P,Q .byte $23,S,P,S,$2d,S,$28,S,$23,H,P,Q .byte $1d,S,P,S,$23,S,$1f,S,$1d,Q,P,E,$1a,Q,$1d,S,P,S .byte $1d,H+E+S,P,S,$1d,E,P,E .byte ENDE

STIMM2 .BYTE P,V,ENDE

STIMM3 ;.BYTE P,V,ENDE .BYTE K,2 .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $b6,E,P,E,$b6,E,P,E,$b6,E,P,E,$b6,E,P,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $aa,E,P,E,$aa,E,P,E,$80,E,P,E,$80,E,P,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $b6,E,P,E,$b6,E,P,E,$b6,E,P,E,$b6,E,P,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $aa,E,P,E,$aa,E,P,E,$80,E,P,E,$80,E,P,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $b6,E,P,E,$b6,E,P,E,$b6,E,P,E,$b6,E,P,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $aa,E,P,E,$aa,E,P,E,$80,E,P,E,$80,E,P,E .byte $8f,E,$71,E,$8f,E,$71,E,$8f,E,$80,E,$8f,E,$80,E .byte $8f,E,$71,E,$8f,E,$80,E,$8f,E,$80,E,$8f,E,$80,E .byte $8f,E,$71,E,$8f,E,$71,E,$8f,E,$80,E,$8f,E,$80,E .byte $8f,E,$71,E,$80,E,$aa,E,$80,E,$aa,E,$80,E,$aa,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $8f,E,P,E,$8f,E,P,E,$8f,E,P,E,$8f,E,P,E .byte $aa,E,P,E,$aa,E,P,E,$80,E,$80,Q,$80,S,P,S .byte $5f,Q,$5f,E,$80,E,$5f,E,$80,E,$5f,E,$80,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $b6,E,P,E,$b6,E,P,E,$b6,E,P,E,$b6,E,P,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $aa,E,P,E,$aa,E,P,E,$80,E,P,E,$80,E,P,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $b6,E,P,E,$b6,E,P,E,$b6,E,P,E,$b6,E,P,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $aa,E,P,E,$aa,E,P,E,$80,E,P,E,$80,E,P,E .byte $8f,E,$71,E,$8f,E,$71,E,$8f,E,$80,E,$8f,E,$80,E .byte $8f,E,$71,E,$8f,E,$80,E,$8f,E,$80,E,$8f,E,$80,E .byte $8f,E,$71,E,$8f,E,$71,E,$8f,E,$80,E,$8f,E,$80,E .byte $8f,E,$71,E,$80,E,$aa,E,$80,E,$aa,E,$80,E,$aa,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $8f,E,P,E,$8f,E,P,E,$8f,E,P,E,$8f,E,P,E .byte $aa,E,P,E,$aa,E,P,E,$80,E,$80,Q,$80,S,P,S .byte $5f,H+E+S,P,S,$bf,E,P,E .BYTE ENDE

STIMM4 ;.BYTE P,V,ENDE .byte K,4 .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S .byte $d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S .byte $d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,P,E+S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S .byte $d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S .byte $d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,P,E+S .BYTE ENDE

Aber da sind doch noch ein paar Fallstricke, die ich nicht berücksichtige, aber wo auch aktuell ein Beispiel fehlt. Ich arbeite noch daran...

Grüße Janko

Antworten

Heute habe ich leider wenig Zeit, aber hier um eine Oktave verschoben:

STIMM1 ;.BYTE P,V,ENDE .BYTE K,0 .byte P,V .byte P,V .byte P,V .byte P,V .byte $51,S,P,S,$66,S,$5b,S,$51,H,P,Q .byte $4c,S,P,S,$60,S,$55,S,$4c,H,P,Q .byte $51,S,P,S,$66,S,$5b,S,$51,H,P,S,$66,S,$5b,S,$51,S .byte $4c,Q+E,$79,E,$80,E,$6c,Q+E .byte $51,S,P,S,$66,S,$5b,S,$51,H,P,Q .byte $4c,S,P,S,$60,S,$55,S,$4c,H,P,Q .byte $51,S,P,S,$66,S,$5b,S,$51,H,P,S,$66,S,$5b,S,$51,S .byte $4c,Q+E,$79,S,P,S,$80,Q,$51,E,P,E .byte $3c,H,$40,H .byte $3c,S,P,S,$48,S,$3c,S,$40,H+E+S,P,S .byte $3c,H,$40,H .byte $48,S,$40,S,$3c,S,P,S,$6c,H+E+S,P,S .byte $51,S,P,S,$60,S,$5b,S,$51,H,P,Q .byte $48,S,P,S,$5b,S,$51,S,$48,H,P,Q .byte $3c,S,P,S,$48,S,$40,S,$3c,Q,P,E,$35,Q,$3c,S,P,S .byte $3c,H+Q+E+S,P,S .byte $28,S,P,S,$32,S,$2d,S,$28,H,P,Q .byte $25,S,P,S,$2f,S,$2a,S,$25,H,P,Q .byte $28,S,P,S,$32,S,$2d,S,$28,H,P,S,$32,S,$2d,S,$28,S .byte $25,Q+E,$3c,E,$40,E,$35,Q+E .byte $28,S,P,S,$32,S,$2d,S,$28,H,P,Q .byte $25,S,P,S,$2f,S,$2a,S,$25,H,P,Q .byte $28,S,P,S,$32,S,$2d,S,$28,H,P,S,$32,S,$2d,S,$28,S .byte $25,Q+E,$3c,S,P,S,$40,Q,$28,E,P,E .byte $3c,H,$40,H .byte $3c,S,P,S,$48,S,$3c,S,$40,H+E+S,P,S .byte $3c,H,$40,H .byte $48,S,$40,S,$3c,S,P,S,$6c,H+E+S,P,S .byte $51,S,P,S,$60,S,$5b,S,$51,H,P,Q .byte $48,S,P,S,$5b,S,$51,S,$48,H,P,Q .byte $3c,S,P,S,$48,S,$40,S,$3c,Q,P,E,$35,Q,$3c,S,P,S .byte $3c,H+E+S,P,S,$3c,E,P,E .byte ENDE

Antworten

Hi!

Ja, an so eine Lautstärkenanpassung habe ich auch schon gedacht. Nur ist das mit den Hüllkurven nicht so einfach... kann ich aber mal versuchen. Am einfachsten wäre wohl die Möglichkeit per Option die Hüllkurven austauschen zu können und so eine Laute und eine Leise nutzen zu können.

Mal schauen... Janko

Antworten

Hallo!

Das ganze sind Web-Seiten / Web-Anwendungen:

1) Eine Webseite, wo aus der MIDI-Datei die Noten und Längen ausgelesen werden und dann entsprechend angezeigt 2) Die Dir schon bekannte Seite, wo man die Noten dann in Normal/Bass - Werte umsetzen kann. Dort wird dann auch künftig die Möglichkeit sein, die Noten eine Oktave höher/niedriger umzusetzen.

Sobald ich fertig bin, wirst Du die Links bekommen.

Grüße Janko

Antworten

Hallo!

https://www.grewe.eu/sound

Ich konnte nun 5 von 7 Midi-Dateien damit umsetzen. Auch meine Midi-Datei mit dem Zweiklang funktionierte.

Kannst ja mal testen... sind bestimmt noch eine Menge Fehler enthalten 8-)

Grüße Janko

Antworten

Hallo Peter!

Sicherlich werde ich die eine oder andere Anpassung noch an der Engine durchführen, jedoch war mein Hauptziel, dass diese möglichst schlank bleibt und gut in ein Spiel zu integrieren ist. Gerne kannst Du das Script verbessern und erweitern.

Die MIDI-Umsetzung ist nicht perfekt, aber dennoch gut zu nutzen. Ich kopiere die Daten übrigens immer per Copy&Paste in den ASM-Code um? Wieso musst Du da etwas tippen?

Auch hier wird sicherlich noch die eine oder andere Verbesserung stattfinden. Aber einen vollautomatischen Prozess will ich eigentlich nicht. So hat man mehr Eingriff- und Kontrollmöglichkeiten. Immerhin ist das ganze ein Werkzeug für Programmierer (und ich bezweifel, dass es jemand anders ausser uns beiden nutzen wird.)

Ich überlege nur, ob ich den Assembler-Code des Players auf der Seite verfügbar machen darf oder nicht. Immerhin ist der ursprüngliche Programmierer Peter Finzel.

Grüße Janko

Antworten

Hallo!

Ich werde mal schauen, ob ich eine Kontaktadresse zu Herrn Finzel bekomme und ob er bedenken hat. Das Buch macht ja keinerlei Umsatz mehr und steht eh im Internet frei zum Download. Ansonsten gibt es den Code auf Nachfrage.

Wenn alles gut läuft, kann man im ABBUC-Forum ggf. den Umsetzer vorstellen. Falls da jemand dann Intresse hat, würde es mich natürlich freuen. Aber die meisten haben sicherlich schon ein Musik-Script, den sie immer wieder nutzen. Und soviele Anfänger in der Programmierung gibt es dann sicherlich auch nicht.

Grüße Janko

Antworten

Habe gestern ein paar weitere Midi-Files getestet und dabei die Sound-Engine ein wenig weiterentwickelt. Nun kann man z.B. der Hüllkruve einen Loop verpassen, damit lange Noten nicht automatisch eine unendlich lange Hüllkruve benötigt. Den Quellcode kann ich Dir heute Abend zusenden, damit wir da nicht doppelt programmieren.

Der Midi-Umsetzer selber ist unverändert. Habe testweise mal 32stl Noten aufnehmen wollen, aber dass würde das Programm völlig verändern. Und 64stl Noten wären der Tot :-) Leider benötigt die Toccata in D-Moll 64stl Noten... naja, schade. Einzige Möglichkeit wäre, wenn man vorab einstellt, wie hoch die Auflösung sein soll, da bei 64stl Noten natürlich sehr viele Pausen erkannt werden, wenn im Midi-File die Noten nicht bis zu Ende gespielt werden.

Grüße Janko

Antworten

Hi!

Das Problem ist nicht das Abspielen der Musik, sondern bei der MIDI-Datei, da diese sehr kurze Zeitintervalle besitzt, die eine Erkennung entsprechend auch erschweren.

Bezüglich meiner Webseite: Die möchte ich eigentlich noch erweitern und ggf. im ABBUC-Forum auch vorstellen. Den Quellcode würde ich aktuell nur ungern rausgeben, da er unsauber ist und noch viele Fehler enthält und regelmäßig verändert wird. Da meine Webseite hier bei mir zu Hause gehostet wird, habe ich kaum Kosten für den Betrieb (nur Strom für die RasPi 4), so dass ich da nicht so schnell an eine Abschaltung denke.

Grüße Janko

Antworten

Hallo!

Entschuldige, ich war gerade am Testen... ich arbeite wohl besser in einer Kopie :-)

  .byte $b5,E+S,$b5,E+S,$99,E+S,$99,E+S,$88,E,$80,E,$79,E,$88,S,$79,E,$88,S,$79,E,$88,S,$79,E,$88,S,$5b,S,$99,S 
  .byte $79,S,$66,S,$b5,E,P,S,$b5,E,P,S,$b5,E,P,S,$b5,S,P,E,$2d,S,$32,S,$39,S,$3c,S,$99,E,P,S,$99,E,P,S,$99,E,P,S 
  .byte $99,S,P,S,$88,S,$88,S,$32,S,$2f,S,$32,S,$88,E,P,S,$88,E,P,S,$88,E,P,S,$88,S,P,E,$21,S,$25,S 
  .byte $32,E,$72,S,$39,S,P,S,$66,S,$39,S,P,S,$72,S,$39,S,$b5,S,$5b,S,$b5,S,$99,S,$4c,S,$99,S,$b5,E

Du musst Deine Noten zwei Oktaven höher transponieren, da Du mit F1 einfach zu tief bist.

Grüße Janko

Antworten

Nein, Du kannst Deine Daten normal ins Feld eingeben (kopieren). Dann oben wo "Transposition: keine" steht, im Dropdown "zwei Oktaven höher" auswählen. Ups.. ich habe BASS nicht ausgewählt gehabt :-) Musst Du also noch einmal umsetzen.

Bin dabei, dass 32stl-Noten umgesetzt werden können :-)

Grüße Janko

Antworten

Hi!

Schon wieder so spät... :-(

Noch nicht schön, aber schon einmal ein Anfang. ACHTUNG: In Pal ist es etwas langsam... also besser 60Hz nutzen.

  org $2000

  icl 'Systemkonstanten.asm'

  .proc main

  jsr TitelMusik.MUSINI

?mainloop lda RTCLOK+2 ?loop cmp RTCLOK+2
beq ?loop lda RTCLOK+2 ?loop2 cmp RTCLOK+2
beq ?loop2

        jsr TitelMusik.MUSPLAY  ; Muss alle 1/50 Sekunde aufgerufen werden (z.B. im VBI)

        jmp ?mainloop

        .end

        run main

; ; ;************ ; Musik-Generator V1.1 vom 31.03.2022 (0107) ; ;** .proc TitelMusik

;
;**************************************************
; Interne Variablen fuer MUSIK
;**************************************************
;

CSREGL EQU $CE ; Zeropageregister CSREGH EQU $CF

;**************************************************
; VBI-Routine, alle 1/50sec. aufgerufen
;**************************************************
;

MUSPLAY LDX #0 ; Kanal 0 zuerst spielen MUNXKN STX MUKANAL ; Kanal merken JSR MUXPLY ; Ton für Stimme holen JSR MUXHUL ; Huellkurve f. eine Stimme holen JSR MUPLAY ; Ton/Huellkruve spielen INX ; naechste Stimme CPX #4 ; schon alle 4 Stimmen? BNE MUNXKN ; nein --> ; RTS ; ;******* ; Initialisierungsroutine ; POKEY init., Variable loeschen, VBI setzen ;******* ; MUSINI LDA #0 ; POKEY und Variablen loeschen LDX #3 ; je 4 Register ; MUSEN1 STA AUDF1,X ; AUDF/C 1/2 STA AUDF1+4,X ; AUDF/C 3/4 STA MUDUR1,X ; Tondauer:=0 STA MUHPT1,X ; Huellk.-Zeiger:=Tabellenanfang DEX ; schon alle 4? BPL MUSEN1 ; nein, nochmal --> ; ; LDA #3 ; Pokey ruecksetzen STA SKCTL LDA #$0 ; Sound-Kontrollreg. zurueck STA AUDCTL ; LDX #$00 ; Setzen der einzelnen Zeiger LDA #STIMM1 ; Entspricht ein Rücksetzen STA STMTBH,X ; der Musik INX LDA #STIMM2 STA STMTBH,X
INX LDA #STIMM3 STA STMTBH,X
INX LDA #STIMM4 STA STMTBH,X
; RTS ; ;******* ; VBI ausschalten ; Vektor wird auf alten Wert zurueckgesetzt ;******* ; MUSAUS LDA #0 ; Sound aus! LDX #3 ; alle 4 Kanaele MUSAU1 STA AUDF1,X ; AUDF/C 1/2 STA AUDF1+4,X ; AUDF/C 3/4 DEX ; schon alle 4? BPL MUSAU1 ; nein, nochmal --> MUXPEN RTS ; ;******* ;Einen Kanal spielen ;pruefen der Tondauer, evtl. neue Note besorgen, ;Test auf ENDE, START, PAUSE ;******* ; MUXPLY LDA MUDUR1,X ; ist Kanal noch aktiv? BEQ MUXNEU ; nein, dann neue Note ; DEC MUDUR1,X ; sonst nur Tondauer - 1 BNE MUXPEN ; Ton laeuft noch ---> ; MUXNEU LDA #0 ; Flag fuer Pause vorerst STA MUPAU1,X ; zuruecknehmen STA MUHPT1,X ; Huellk. Zeiger auf Anf. LDA STMTBL,X ; Basisadresse der Noten STA CSREGL ; tabelle in Zeropage LDA STMTBH,X ; register umspeichern STA CSREGH ; LDY #0 ; Zeiger in Notentabelle LDA (CSREGL),Y ; Tonhoehe der Note ;
CMP #START ; ist START-Befehl? BNE MUXN1 ; nein ---> JSR MUSINI LDX #$00
JMP MUXNEU ; MUXN1 CMP #ENDE ; ist ENDE-Befehl? BEQ MUXPAU ; ja, dann Pause imitieren --> ; CMP #LOOP ; Loop? BNE MUXN2 ; Nein, dann weiter MUXN2 JMP MULOOP ; MUXN2 CMP #HUELLKURVE ; Huellkruve wechseln?
BNE MUXN3 LDY #$01
LDA (CSREGL),Y ; gewünschte Kurve lesen STA MUHUELL,X ; und setzen JSR MUXNXT JMP MUXNEU

;

MUXN3 PHA ; Tonhoehe merken LDY #$01
LDA (CSREGL),Y ; Dauer aus Notentabelle lesen STA MUDUR1,X ; in Zaehler f. Notendauer

  JSR MUXNXT
;
  PLA       ; Tonhoehe wieder holen
  CMP #PAUSE      ; war es ein PAUSE Befehl?
  BEQ MUXPAU      ; ja ,dann Pausenbearbeitung
;
  STA STTON,X
  RTS
;

MUXPAU LDA #PAUSE ; Huellk. ausschalten STA MUPAU1,X RTS ;
MUXNXT CLC LDA STMTBL,X ; Noten Zeiger auf ADC #$02 ; naechste Note richten STA STMTBL,X ; und abspeichern LDA STMTBH,X
ADC #$00 STA STMTBH,X
RTS

MULOOP LDY #$01
LDA (CSREGL),Y ; zweites Byte lesen BNE MULOOP1 ; = 0? Dann weiter DEC MULOOPCNT,X LDA MULOOPCNT,X BNE @+ ; Zähler ungleich 0 -> @ JSR MUXNXT ; nächste Note holen JMP MUXNEU ; und abspielen

@ LDA MULOOPADRL,X ; gemerkte Adresse STA STMTBL,X ; holen und abspielen LDA MULOOPADRH,X STA STMTBH,X
JMP MUXNEU ; Neue Adresse abspielen

MULOOP1 STA MULOOPCNT,X ; Loop-Zähler setzen JSR MUXNXT ; Adresszähler erhöhen LDA STMTBL,X ; holen und abspielen STA MULOOPADRL,X ; gemerkte Adresse LDA STMTBH,X
STA MULOOPADRH,X JMP MUXNEU ; Nächste Note holen und abspielen

;
;**************************************************
; Huellkurvengenerator
; Lautstaerke fuer einen Kanal wird gemaess
; Huellkurve eingestellt
;**************************************************
;

MUXHUL LDA STTON,X STA MUTEMP

  LDA MUPAU1,X      ; Flag fuer Pause?
  CMP #PAUSE      ; ist auf Pause?
  BNE MUXH1     ; nein, normale Huellk.
;
  LDA #0        ; Pause Lautstaerke auf Null
  STA STDIS,X     ; Lautst. merken
  BEQ MUXHEN      ; (immer!) an Pokey -->
;

MUXH1 LDA MUHUELL,X TAX LDA MHLTBL,X ; Huellkurven Basisadresse STA CSREGL ; in Zeropage Register LDA MHLTBH,X ; MSB STA CSREGH LDX MUKANAL LDY MUHPT1,X ; aktueller Zeiger in Hk. LDA (CSREGL),Y ; neuer Stuetzpunkt CMP #ENDE ; ist Huellk. zu Ende? BEQ MUXHEN ; ja, dann fertig! STA STDIS,X

MUDIS INY LDA (CSREGL),Y ; CMD = 0 Ton addieren BNE MUXH2 INY CLC LDA STTON,X ADC (CSREGL),Y STA MUTEMP JMP MUXHNX

MUXH2 CMP #$01 ; CMD = 1 Ton übernehmen BNE MUXH3 INY LDA (CSREGL),Y STA MUTEMP JMP MUXHNX

MUXH3 CMP #$02 ; CMD = 2 Ton subtrahieren BNE MUXH4 INY SEC LDA STTON,X SBC (CSREGL),Y STA MUTEMP JMP MUXHNX

MUXH4 CMP #$03 ; CMD = 3 Zeiger zurück BNE MUXH5 INY TYA SEC SBC (CSREGL),Y SBC (CSREGL),Y SBC (CSREGL),Y SBC #$02 TAY JMP MUDIS

MUXH5 INY ; Stuetzpunkt merken MUXHNX INY ; HK-Zeiger weiterschalten TYA ; und abspeichern STA MUHPT1,X

MUXHEN RTS

MUPLAY TXA ; Offset fuer Pokey-Register ASL ; A Index mal 2 TAY LDA MUTEMP STA AUDF1,Y LDA STDIS,X STA AUDC1,Y ; an POKEY geben

  RTS

;
;**************************************************
;Tabellen der Basisadressen fuer Noten2530 ;und Huellkurven Tabellen.
;**************************************************
;

STTON .byte $00,$00,$00,$00 ; Speicher für Tonhöhe STDIS .byte $00,$00,$00,$00 ; Speicher für Lautstärke/Verzerrung MUDUR1 .byte $00,$00,$00,$00 ; Zaehler fuer Tondauer MUPAU1 .byte $00,$00,$00,$00 ; Flag fuer Pause MUHPT1 .byte $00,$00,$00,$00 ; Zeiger in Huellkurve MUHUELL .byte $00,$01,$02,$03 ; Zeiger auf verwendete Huellkruve MULOOPADRL .byte $00,$00,$00,$00 ; Loop-Addr LO merken MULOOPADRH .byte $00,$00,$00,$00 ; Loop-Addr HI merken MULOOPCNT .byte $00,$00,$00,$00 ; Loop-Zähler MUKANAL .byte $00 ; Aktueller Kanal MUTEMP .byte $00 ; Temporäre Daten

STMTBL .byte STIMM1,>STIMM2,>STIMM3,>STIMM4

MHLTBL .byte HUELL0

;
;***************************************************
;Definition der einzelnen Tonlängen
;Sechszehntel ist die kürzeste Länge
;***************************************************
;

PAUSE EQU $ff ; Code f. Pause P EQU PAUSE ; Kuerzel f. Pause START EQU $fe ; Code fuer Musik-Neubeginn ENDE EQU $fd ; Code fuer Stimmende HUELLKURVE EQU $fc ; Code fuer Huellkurve K EQU HUELLKURVE ; Kuerzel f. Huellkruve LOOP EQU $fb ; Code für einen Loop L EQU LOOP ; Kuerzel f. Loop ; DAUER EQU 1 ; Dauer eines 16tel ; V EQU DAUER64 ; H EQU DAUER32 ; Halbe Note Q EQU DAUER16 ; Viertel Note (Quarter) E EQU DAUER8 ; Achtel Note (Eight) S EQU DAUER4 ; Sechzehntel Note T EQU DAUER2 ; Zweiunddreizigstel VS EQU DAUER ; Vierundsechszigstel

;
;***************************************************
;Notentabellen:
;jede Tabelle beginnt mit Label STIMM<n>
;wobei <n>:Nummer der Stimme (1-4)
;danach folgen die Noten (Note,Dauer)
;jeweils in .byte Befehlen.
;nach letzter Note muss 'ENDE' oder
;'START' eingetragen werden.
;'START' startet die gesamte Melodie neu!
;
;Man kann mit K,1 die Hüllkurve 1 auswählen
;Mit L,8 ..... L,0 kann man die Noten 8x wiederholen
;***************************************************
;

STIMM1 ;.byte P,V,ENDE .byte K,0 .byte $23,T,P,VS,$28,T,P,VS,$23,H+Q+E+VS,P,VS
.byte $28,T,P,VS,$2d,T,P,VS,$2f,T,P,VS,$35,T,P,VS,$39,H+T+VS,P,T,$1a,Q+S
.byte P,H+Q+E+T+VS,$48,T,P,VS,$51,T
.byte P,VS,$48,H+Q+S+VS,P,S+VS,$60,E+T+VS
.byte P,VS,$5b,E+T+VS,P,VS,$72,E+T+VS,P,VS,$6c,Q+E,P,E+S+T+VS
.byte P,H+Q+S+VS,$90,T,P,VS,$a2,T,P,VS,$90,H+Q+E+VS
.byte P,VS,$a2,T,P,VS,$b5,T,P,VS,$c1,T,P,VS,$d9,T,P,VS,$e6,H+T+VS,P,T,$6c,Q+S
.byte P,H+Q+E+T+VS,$d9,V+V+V,$d9,V+V+H+Q+E+S+T+VS,P,H+Q+E+S+VS
.byte $72,T+VS,P,VS,$6c,T+VS,P,VS,$60,T+VS,P,VS,$72,T+VS,P,VS,$6c,T+VS,P,VS,$60,T+VS,P,VS,$72,T+VS,P,VS,$6c,T+VS,P,VS,$60,T+VS,P,VS,$72,T+VS,P,VS,$6c,S+VS,P,VS,$60,S+VS,P,VS,$5b,T+VS,P,VS,$51,T+VS,P,VS,$60,T+VS,P,VS .byte $5b,T+VS,P,VS,$28,T+VS,P,VS,$2f,T+VS,P,VS,$2d,T+VS,P,VS,$28,T+VS,P,VS,$2f,T+VS,P,VS,$2d,S+VS,P,VS,$28,S+VS,P,VS,$48,T+VS,P,VS,$44,T+VS,P,VS,$51,T+VS,P,VS,$48,T+VS,P,VS,$44,T+VS,P,VS,$51,T+VS,P,VS,$48,T+VS,P,VS .byte $44,T+VS,P,VS,$51,T+VS,P,VS,$23,E+T+VS,P,H+E+S+VS
.byte P,V
.byte $39,T+VS,P,VS,$1a,T+VS,P,VS,$2f,T+VS,P,VS,$39,T+VS,P,VS,$35,T+VS,P,VS,$2f,T+VS,P,VS,$39,T+VS,P,VS,$35,T+VS,P,VS,$2f,T+VS,P,VS,$39,T+VS,P,VS,$35,S+VS,P,VS,$2f,S+VS,P,VS,$2d,T+VS,P,VS,$28,T+VS,P,VS,$2f,T+VS,P,VS .byte $2d,T+VS,P,VS,$28,T+VS,P,VS,$2f,T+VS,P,VS,$2d,T+VS,P,VS,$28,T+VS,P,VS,$2f,T+VS,P,VS,$2d,S+VS,P,VS,$28,S+VS,P,VS,$23,T+VS,P,VS,$21,T+VS,P,VS,$28,T+VS,P,VS,$23,T+VS,P,VS,$21,T+VS,P,VS,$28,T+VS,P,VS,$23,T+VS,P,VS .byte $21,T+VS,P,VS,$28,T+VS,P,VS,$23,E+T+VS,P,H+E+S+VS
.byte P,H,$23,T+VS,P,VS,$28,T+VS,P,VS,$21,T+VS,P,VS,$2f,T+VS,P,VS,$28,T+VS,P,VS,$21,T+VS,P,VS,$2f,T+VS,P,VS,$2d,T+VS,P,VS .byte $23,T+VS,P,VS,$35,T+VS,P,VS,$2d,T+VS,P,VS,$23,T+VS,P,VS,$35,T+VS,P,VS,$2f,T+VS,P,VS,$28,T+VS,P,VS,$3c,T+VS,P,VS,$2f,T+VS,P,VS,$28,T+VS,P,VS,$3c,T+VS,P,VS,$35,T+VS,P,VS,$2d,T+VS,P,VS,$44,T+VS,P,VS,$35,T+VS,P,VS,$2d,T+VS,P,VS .byte $44,T+VS,P,VS,$3c,T+VS,P,VS,$2f,T+VS,P,VS,$48,T+VS,P,VS,$3c,T+VS,P,VS,$2f,T+VS,P,VS,$48,T+VS,P,VS,$44,T+VS,P,VS,$35,T+VS,P,VS,$51,T+VS,P,VS,$44,T+VS,P,VS,$35,T+VS,P,VS,$51,T+VS,P,VS,$48,T+VS,P,VS,$3c,T+VS,P,VS,$5b,T+VS,P,VS .byte $48,T+VS,P,VS,$3c,T+VS,P,VS,$5b,T+VS,P,VS,$51,T+VS,P,VS,$44,T+VS,P,VS,$60,T+VS,P,VS,$51,T+VS,P,VS,$44,T+VS,P,VS,$60,T+VS,P,VS,$5b,T+VS,P,VS,$48,T+VS,P,VS,$6c,T+VS,P,VS,$5b,T+VS,P,VS,$48,T+VS,P,VS,$6c,T+VS,P,VS,$60,T+VS,P,VS .byte $51,T+VS,P,VS,$72,T+VS,P,VS,$60,T+VS,P,VS,$51,T+VS,P,VS,$72,T+VS,P,T,$d9,V+V+E+S+T,P,S+VS,$23,T,P,VS,$28,T,P,VS,$2d,T,P,VS,$2f,T,P,VS,$35,T,P,VS,$39,S+VS,P,VS,$48,S+VS,P,VS,$39,S+VS,P,VS,$2f,T,P,VS,$28,T .byte P,VS,$2d,VS,P,VS,$28,VS,P,VS,$2d,VS,P,VS,$28,VS,P,VS,$2d,VS,P,VS,$28,VS,P,VS,$2d,VS,P,VS,$28,VS,P,VS,$2d,VS,P,VS,$2f,S+VS,P,VS,$2d,H+T,P,S+VS .byte P,V
.byte $23,S,P,T,$1a,S+VS,P,VS,$17,S+VS,P,VS,$16,S+VS,P,VS,$1a,S+VS,P,VS,$17,S+VS,P,VS,$16,S+VS,P,VS,$13,S+VS,P,VS,$17,S+VS,P,VS,$16,S+VS,P,VS,$13,S+VS .byte P,VS,$11,S+VS,P,VS,$16,S+VS,P,VS,$13,S+VS,P,VS,$11,S+VS,P,VS,$10,S+VS,P,VS,$13,S+VS,P,VS,$11,S+VS,P,VS,$16,S+VS,P,VS,$13,S+VS,P,VS,$17,S+VS,P,VS,$16,S+VS .byte P,VS,$1a,S+VS,P,VS,$17,S+VS,P,VS,$1c,S+VS,P,VS,$1a,S+VS,P,S,$23,S,P,T,$23,S,P,T,$23,Q,P,T,$23,S,P,T .byte $23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S .byte P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S .byte P,T,$23,S,P,T,$23,S,P,S+T,$6c,E+S+T+VS,P,Q+E+S+T+VS
.byte P,H+T,$6c,E+T+VS,P,VS,$79,E+T+VS,P,VS,$88,E+T+VS
.byte P,VS,$39,E+T+VS,P,H+Q+S
.byte P,Q+E+S+VS,$6c,E+T+VS,P,VS,$79,E+T+VS,P,VS,$88,E+T+VS
.byte P,VS,$60,Q+E+T,P,S,$28,T,P,VS,$2d,T,P,VS,$2f,T,P,VS,$35,T,P,VS,$39,T,P,VS,$40,T,P,VS,$39,T,P,VS,$48,T,P,VS,$40,T,P,VS,$39,T,P,VS,$35,T,P,VS .byte $2f,T,P,VS,$2d,T,P,VS,$28,T,P,VS,$23,T,P,VS,$28,T,P,VS,$2d,T,P,VS,$2f,T,P,VS,$2d,T,P,VS,$35,T,P,VS,$2d,T,P,VS,$23,T,P,VS,$1c,T,P,VS,$1a,T,P,VS,$23,T,P,VS,$1f,T,$1c,T,P,VS,$1a,T,P,VS,$17,T,P,VS,$16,T,P,VS,$13,T,P,VS,$11,T,P,VS,$10,E+S+VS .byte P,VS,$6c,E+T+VS,P,VS,$79,E+T+VS,P,VS,$88,E+T+VS,P,VS,$90,Q+E+T+VS
.byte P,H+Q+S,$1a,S+T+VS,P,VS,$16,S+T+VS
.byte P,VS,$23,S+T+VS,P,VS,$17,S+T+VS,P,VS,$88,E+S+T+VS,P,VS,$11,E+S+T+VS,P,VS,$1a,E+S+T+VS
.byte P,VS,$a2,Q+E+S+T,P,VS,$1f,T+VS,P,VS,$23,T+VS,P,VS,$1c,T+VS,P,VS,$17,T,P,VS,$13,T,P,VS,$10,S+VS,P,VS,$11,T,P,VS,$13,T,P,VS,$16,T .byte P,VS,$17,T,P,VS,$16,T,P,VS,$17,T,P,VS,$1a,T,P,VS,$1c,T,P,VS,$1a,T,P,VS,$1d,T,P,VS,$21,T,P,VS,$23,T,P,VS,$28,T,$2d,T,P,VS,$2f,T,P,VS,$35,T,P,VS,$2f,H+Q+E+S .byte P,VS,$28,S+VS,P,VS,$2f,S+VS,P,VS,$39,S+VS,P,VS,$2f,S+VS,P,VS,$39,S+VS,P,VS,$2f,S+VS,P,VS,$28,S+VS,P,VS,$2f,S+VS,P,VS,$39,S+VS,P,VS,$1c,S+VS,P,VS,$39,S+VS .byte P,VS,$2f,S+VS,P,VS,$28,S+VS,P,VS,$2f,S+VS,P,VS,$39,S+VS,P,VS,$2f,S+VS,P,VS,$39,S+VS,P,VS,$2f,S+VS,P,VS,$28,S+VS,P,VS,$2f,S+VS,P,VS,$21,S+VS,P,VS,$2f,S+VS .byte P,VS,$39,S+VS,P,VS,$44,S+VS,P,VS,$39,S+VS,P,VS,$44,S+VS,P,VS,$51,S+VS,P,VS,$44,S+VS,P,VS,$51,S+VS,P,VS,$44,S+VS,P,VS,$39,S+VS,P,VS,$44,S+VS,P,VS,$51,S+VS .byte P,VS,$44,S+VS,P,VS,$51,S+VS,P,VS,$44,S+VS,P,VS,$39,S+VS,P,VS,$44,S+VS,P,VS,$51,S+VS,P,VS,$44,S+VS,P,VS,$51,S+VS,P,VS,$28,S+VS,P,VS,$39,S+VS,P,VS,$44,S+VS .byte P,VS,$51,S+VS,P,VS,$44,S+VS,P,VS,$51,S+VS,P,VS,$60,S+VS,P,VS,$51,S+VS,P,VS,$60,S+VS,P,VS,$72,S+VS,P,VS,$60,S+VS,P,VS,$44,S+VS,P,VS,$60,S+VS,P,VS,$51,S+VS .byte P,VS,$60,S+VS,P,VS,$72,S+VS,P,VS,$60,S+VS,P,VS,$72,S+VS,P,VS,$60,S+VS,P,VS,$51,S+VS,P,VS,$60,S+VS,P,VS,$72,S+VS,P,VS,$60,S+VS,P,VS,$72,S+VS,P,VS,$60,S+VS .byte P,VS,$51,S+VS,P,VS,$60,S+VS,P,VS,$72,S+VS,P,VS,$60,S+VS,P,VS,$72,S+VS,P,VS,$60,S+VS,P,VS,$51,S+VS,P,VS,$39,S+VS,P,VS,$51,S+VS,P,VS,$28,S+VS,P,VS,$51,S+VS .byte P,VS,$60,S+VS,P,VS,$51,S+VS,P,VS,$60,S+VS,P,VS,$51,S+VS,P,VS,$44,S+VS,P,VS,$51,S+VS,P,VS,$60,S+VS,P,VS,$2f,S+VS,P,VS,$60,S+VS,P,VS,$51,S+VS,P,VS,$44,S+VS .byte P,VS,$51,S+VS,P,VS,$60,S+VS,P,VS,$51,S+VS,P,VS,$60,S+VS,P,VS,$51,S+VS,P,VS,$44,S+VS,P,VS,$51,S+VS,P,VS,$44,S+VS,P,VS,$39,S+VS,P,VS,$44,S+VS,P,VS,$39,S+VS .byte P,VS,$44,S+VS,P,VS,$39,S+VS,P,VS,$44,S+VS,P,VS,$39,S+VS,P,VS,$44,S+VS,P,VS,$39,S+VS,P,VS,$28,S+VS,P,VS,$39,S+VS,P,VS,$2f,S+VS,P,VS,$39,S+VS,P,VS,$2f,S+VS .byte P,VS,$28,S+VS,P,VS,$2f,S+VS,P,VS,$28,S+VS,P,VS,$2f,S+VS,P,VS,$28,S+VS,P,VS,$2f,S+VS,P,VS,$17,S+VS,P,VS,$2f,S+VS,P,VS,$28,S+VS,P,VS,$51,H+E+S+T+VS .byte P,VS,$1a,H+E+S+T,P,T,$44,H+Q+E+S+T+VS
.byte P,VS,$48,S+T+VS,P,VS,$51,S+T+VS,P,VS,$13,E+S+T+VS,P,VS,$5b,S+VS,P,VS,$6c,S+VS,P,VS,$60,S+VS,P,VS,$72,S+VS,P,VS,$6c,S+VS,P,VS,$80,S+VS .byte P,VS,$72,S+VS,P,VS,$90,S+VS,P,VS,$88,S+VS,P,VS,$99,S+VS,P,VS,$90,S+VS,P,VS,$23,S,P,T,$5b,E+T+VS,P,VS,$48,H+T+VS .byte P,VS,$51,S+T,P,T,$d9,V
.byte ENDE

STIMM2 ;.byte P,V,ENDE .byte K,0 .byte $11,T,P,VS,$13,T+VS,$11,H+Q+E+VS,P,VS
.byte $13,T+VS,$16,T+VS,$17,T+VS,$1a,T+VS,$1c,H+T+VS,P,T,$35,Q+S
.byte P,H+Q+E+T+VS,$23,T,P,VS,$28,T+VS
.byte $23,H+Q+S+VS,P,S+VS,$2f,E+T+VS
.byte P,VS,$2d,E+T+VS,P,VS,$39,E+T+VS,P,VS,$35,Q+E,P,E+S+T+VS
.byte P,H+Q+S+VS,$48,T,P,VS,$51,T+VS,$48,H+Q+E+VS
.byte P,VS,$51,T+VS,$5b,T+VS,$60,T+VS,$6c,T+VS,$72,H+T+VS,P,T,$d9,Q+S
.byte P,V
.byte P,Q+E+S,$72,V+V+V+Q+E+S+T,P,VS,$35,V+H+Q+E+S+T+VS,P,H+Q+E+S+VS
.byte $39,T+VS,P,VS,$35,T+VS,P,VS,$2f,T+VS,P,VS,$39,T+VS,P,VS,$35,T+VS,P,VS,$2f,T+VS,P,VS,$39,T+VS,P,VS,$35,T+VS,P,VS,$2f,T+VS,P,VS,$39,T+VS,P,VS,$35,S+VS,P,VS,$2f,S+VS,P,VS,$2d,T+VS,P,VS,$28,T+VS,P,VS,$2f,T+VS,P,VS .byte $2d,T+VS,P,VS,$51,T+VS,P,VS,$60,T+VS,P,VS,$5b,T+VS,P,VS,$51,T+VS,P,VS,$60,T+VS,P,VS,$5b,S+VS,P,VS,$51,S+VS,P,VS,$23,T+VS,P,VS,$21,T+VS,P,VS,$28,T+VS,P,VS,$23,T+VS,P,VS,$21,T+VS,P,VS,$28,T+VS,P,VS,$23,T+VS,P,VS .byte $21,T+VS,P,VS,$28,T+VS,P,VS,$48,E+T+VS,P,H+E+S+VS
.byte P,V
.byte $1c,T+VS,P,VS,$35,T+VS,P,VS,$17,T+VS,P,VS,$1c,T+VS,P,VS,$1a,T+VS,P,VS,$17,T+VS,P,VS,$1c,T+VS,P,VS,$1a,T+VS,P,VS,$17,T+VS,P,VS,$1c,T+VS,P,VS,$1a,S+VS,P,VS,$17,S+VS,P,VS,$16,T+VS,P,VS,$13,T+VS,P,VS,$17,T+VS,P,VS .byte $16,T+VS,P,VS,$13,T+VS,P,VS,$17,T+VS,P,VS,$16,T+VS,P,VS,$13,T+VS,P,VS,$17,T+VS,P,VS,$16,S+VS,P,VS,$13,S+VS,P,VS,$11,T+VS,P,VS,$10,T+VS,P,VS,$13,T+VS,P,VS,$11,T+VS,P,VS,$10,T+VS,P,VS,$13,T+VS,P,VS,$11,T+VS,P,VS .byte $10,T+VS,P,VS,$13,T+VS,P,VS,$11,E+T+VS,P,H+E+S+VS
.byte P,H,$11,T+VS,P,VS,$13,T+VS,P,VS,$10,T+VS,P,VS,$17,T+VS,P,VS,$13,T+VS,P,VS,$10,T+VS,P,VS,$17,T+VS,P,VS,$16,T+VS,P,VS .byte $11,T+VS,P,VS,$1a,T+VS,P,VS,$16,T+VS,P,VS,$11,T+VS,P,VS,$1a,T+VS,P,VS,$17,T+VS,P,VS,$13,T+VS,P,VS,$1d,T+VS,P,VS,$17,T+VS,P,VS,$13,T+VS,P,VS,$1d,T+VS,P,VS,$1a,T+VS,P,VS,$16,T+VS,P,VS,$21,T+VS,P,VS,$1a,T+VS,P,VS,$16,T+VS,P,VS .byte $21,T+VS,P,VS,$1d,T+VS,P,VS,$17,T+VS,P,VS,$23,T+VS,P,VS,$1d,T+VS,P,VS,$17,T+VS,P,VS,$23,T+VS,P,VS,$21,T+VS,P,VS,$1a,T+VS,P,VS,$28,T+VS,P,VS,$21,T+VS,P,VS,$1a,T+VS,P,VS,$28,T+VS,P,VS,$23,T+VS,P,VS,$1d,T+VS,P,VS,$2d,T+VS,P,VS .byte $23,T+VS,P,VS,$1d,T+VS,P,VS,$2d,T+VS,P,VS,$28,T+VS,P,VS,$21,T+VS,P,VS,$2f,T+VS,P,VS,$28,T+VS,P,VS,$21,T+VS,P,VS,$2f,T+VS,P,VS,$2d,T+VS,P,VS,$23,T+VS,P,VS,$35,T+VS,P,VS,$2d,T+VS,P,VS,$23,T+VS,P,VS,$35,T+VS,P,VS,$2f,T+VS,P,VS .byte $28,T+VS,P,VS,$39,T+VS,P,VS,$2f,T+VS,P,VS,$28,T+VS,P,VS,$39,T+VS,P,H+E+S+VS
.byte P,Q+S+VS,$72,V+E+S+T,P,H+E+T+VS
.byte P,Q+E+VS,$35,H,P,S+T+VS
.byte P,V
.byte P,E+VS,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S .byte P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S .byte P,T,$23,S,P,T,$23,S,P,T,$23,S,P,T,$23,S,P,S+VS,$21,S+VS,P,VS,$28,S+VS,P,S+T+VS,$2d,S+VS,P,VS,$28,S+VS,P,VS,$2f,S+VS .byte P,VS,$2d,S+VS,P,VS,$35,S+VS,P,VS,$28,S+VS,P,VS,$2f,S+VS,P,VS,$2d,S+VS,P,VS,$35,S+VS,P,VS,$2f,S+VS,P,VS,$39,S+VS,P,VS,$35,S+VS,P,VS,$48,S+VS,P,VS,$44,S+VS .byte P,VS,$51,S+VS,P,VS,$48,S+VS,P,VS,$5b,S+VS,P,VS,$51,S+VS,P,VS,$60,S+VS,P,VS,$5b,S+VS,P,VS,$6c,S+VS,P,VS,$51,S+VS,P,VS,$60,S+VS,P,VS,$5b,S+VS,P,VS,$6c,S+VS .byte P,VS,$60,S+VS,P,VS,$72,S+VS,P,H+Q+S
.byte P,Q+E+S+T,$35,S+VS,P,VS,$21,S+VS,P,VS,$48,S+VS,P,VS,$23,S+VS,P,VS,$44,S+VS,P,VS,$28,S+VS
.byte P,VS,$2f,E+T+VS,P,H+Q+S
.byte P,Q+E+S+VS,$35,S+VS,P,VS,$21,S+VS,P,VS,$48,S+VS,P,VS,$23,S+VS,P,VS,$44,S+VS,P,VS,$28,S+VS
.byte P,VS,$39,Q+E+T,P,H+S+VS
.byte P,V
.byte P,E+S,$1a,S+VS,P,VS,$10,S+VS,P,VS,$23,S+VS,P,VS,$11,S+VS,P,VS,$21,S+VS,P,VS,$13,S+VS,P,VS,$2f,Q+E+T+VS .byte P,H+Q+S,$6c,E+S+T+VS
.byte P,VS,$79,E+S+T+VS,P,VS,$21,S+T+VS,P,VS,$1a,S+T+VS,P,VS,$17,E+S+T+VS,P,VS,$2d,E+S+T+VS
.byte P,VS,$48,Q+E+S+T,P,H+VS
.byte P,H+S+T+VS,$1c,H+Q+E+S
.byte P,VS,$17,S+VS,P,VS,$1c,S+VS,P,VS,$21,S+VS,P,VS,$1c,S+VS,P,VS,$21,S+VS,P,VS,$1c,S+VS,P,VS,$17,S+VS,P,VS,$1c,S+VS,P,VS,$21,S+VS,P,VS,$2f,S+VS,P,VS,$21,S+VS .byte P,VS,$1c,S+VS,P,VS,$17,S+VS,P,VS,$1c,S+VS,P,VS,$21,S+VS,P,VS,$1c,S+VS,P,VS,$21,S+VS,P,VS,$1c,S+VS,P,VS,$17,S+VS,P,VS,$1c,S+VS,P,VS,$39,S+VS,P,VS,$1c,S+VS .byte P,VS,$21,S+VS,P,VS,$28,S+VS,P,VS,$21,S+VS,P,VS,$28,S+VS,P,VS,$2f,S+VS,P,VS,$28,S+VS,P,VS,$2f,S+VS,P,VS,$28,S+VS,P,VS,$21,S+VS,P,VS,$28,S+VS,P,VS,$2f,S+VS .byte P,VS,$28,S+VS,P,VS,$2f,S+VS,P,VS,$28,S+VS,P,VS,$21,S+VS,P,VS,$28,S+VS,P,VS,$2f,S+VS,P,VS,$28,S+VS,P,VS,$2f,S+VS,P,VS,$44,S+VS,P,VS,$21,S+VS,P,VS,$28,S+VS .byte P,VS,$2f,S+VS,P,VS,$28,S+VS,P,VS,$2f,S+VS,P,VS,$39,S+VS,P,VS,$2f,S+VS,P,VS,$39,S+VS,P,VS,$44,S+VS,P,VS,$39,S+VS,P,VS,$72,S+VS,P,VS,$39,S+VS,P,VS,$2f,S+VS .byte P,VS,$39,S+VS,P,VS,$44,S+VS,P,VS,$39,S+VS,P,VS,$44,S+VS,P,VS,$39,S+VS,P,VS,$2f,S+VS,P,VS,$39,S+VS,P,VS,$44,S+VS,P,VS,$39,S+VS,P,VS,$44,S+VS,P,VS,$39,S+VS .byte P,VS,$2f,S+VS,P,VS,$39,S+VS,P,VS,$44,S+VS,P,VS,$39,S+VS,P,VS,$44,S+VS,P,VS,$39,S+VS,P,VS,$2f,S+VS,P,VS,$60,S+VS,P,VS,$2f,S+VS,P,S+T+VS,$2f,S+VS .byte P,VS,$39,S+VS,P,VS,$2f,S+VS,P,VS,$39,S+VS,P,VS,$2f,S+VS,P,VS,$28,S+VS,P,VS,$2f,S+VS,P,VS,$39,S+VS,P,VS,$51,S+VS,P,VS,$39,S+VS,P,VS,$2f,S+VS,P,VS,$28,S+VS .byte P,VS,$2f,S+VS,P,VS,$39,S+VS,P,VS,$2f,S+VS,P,VS,$39,S+VS,P,VS,$2f,S+VS,P,VS,$28,S+VS,P,VS,$2f,S+VS,P,VS,$28,S+VS,P,VS,$21,S+VS,P,VS,$28,S+VS,P,VS,$21,S+VS .byte P,VS,$28,S+VS,P,VS,$21,S+VS,P,VS,$28,S+VS,P,VS,$21,S+VS,P,VS,$28,S+VS,P,VS,$21,S+VS,P,VS,$44,S+VS,P,VS,$21,S+VS,P,VS,$1c,S+VS,P,VS,$21,S+VS,P,VS,$1c,S+VS .byte P,VS,$17,S+VS,P,VS,$1c,S+VS,P,VS,$17,S+VS,P,VS,$1c,S+VS,P,VS,$17,S+VS,P,VS,$1c,S+VS,P,VS,$28,S+VS,P,VS,$1c,S+VS,P,VS,$17,S,P,T,$48,H+E+S+T+VS .byte P,VS,$5b,H+E+S+T+VS,P,VS,$35,H+E+S+T+VS
.byte P,H+VS,$17,E+S+T+VS,P,Q
.byte P,H+Q+T+VS,$1c,S+VS,P,VS,$48,E+T
.byte P,T,$2d,E+T+VS,P,VS,$90,Q+E+S+T+VS,P,VS,$6c,V
.byte ENDE

STIMM3 ;.byte P,V,ENDE .byte K,0 .byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte $60,V+V+H+Q+E+S+T+VS,P,VS,$48,V+H+Q+E+S+T+VS,P,H+Q+E+S+T+VS
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,Q+S,$60,V+E+S+VS,P,H+E+S
.byte P,Q+E,$48,Q+E+S+T,P,E+T
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,H+E+S,$2d,S+VS,P,S+T+VS,$2f,S+VS,P,S+T+VS
.byte $35,S+VS,P,VS,$23,E+T+VS,P,H+E+S+T+VS
.byte P,H+E,$2d,S+VS,P,S+T+VS,$2f,S+VS,P,S+T+VS
.byte $35,S+VS,P,VS,$2f,Q+E+T,P,H
.byte P,V
.byte P,Q+S+T+VS,$16,S+VS,P,S+T+VS,$17,S+VS,P,S+T+VS,$1a,S+VS,P,VS,$1c,Q+E+T+VS
.byte P,H+Q+E+S,$10,S+T+VS
.byte P,E+VS,$11,S+T+VS,P,E+VS,$13,S+T+VS,P,VS,$1c,E+S+T+VS,P,VS,$1f,E+S+T+VS
.byte P,VS,$2f,Q+E+S+T,P,H+VS
.byte P,H+S+T+VS,$51,H+Q+S+T
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,Q+VS,$39,H+E+S+T+VS
.byte P,VS,$48,H+E+S+T+VS,P,VS,$28,H+E+S+T+VS
.byte P,H+VS,$1c,E+S+T+VS,P,Q
.byte P,H+Q+T+VS,$2f,S+VS,P,VS,$35,E+T
.byte P,T,$35,Q+S+T+VS,P,VS,$39,Q+T+VS,P,VS,$48,V
.byte ENDE

STIMM4 ;.byte P,V,ENDE .byte K,0 .byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,H+VS,$51,V+V+Q+E+T,P,S+VS,$6c,V+H+Q+E+S+T+VS,P,Q+E+T
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,H+Q+E+T,$51,V+E+S,P,S+T
.byte P,H+Q+E+S+T,$5b,Q+E+S+T+VS
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,Q+T+VS,$90,E+T+VS,P,H+T
.byte P,V
.byte P,Q+T+VS,$23,Q+E+S+VS,P,Q
.byte P,V
.byte P,V
.byte P,T,$17,Q+E+T+VS,P,H+T+VS
.byte P,V
.byte P,VS,$23,E+S+T+VS,P,VS,$40,E+S+T+VS,P,VS,$23,Q+E+S+T,P,VS
.byte P,V
.byte P,S+T+VS,$17,H+Q+S+T,P,T+VS
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,V
.byte P,E+S+T,$2f,H+E+S+T+VS,P,VS,$35,H+E+S+T
.byte P,T,$21,H+E+S+T+VS,P,H+VS
.byte $23,E+S+T+VS,P,H+Q+VS
.byte P,Q+T,$48,S,P,T,$2d,E+T,P,T,$6c,E+T+VS,P,VS,$2f,Q
.byte $2f,E+S+T+VS,P,VS,$35,V
.byte ENDE

;**************************************************
; HUELLKURVENTABELLEN
; Hier werden Stuetzpunkte der Huellkurven
; als Lautstaerkewerte eingetragen
; jede Tabelle beginnt mit HUELL<n>
; und endet mit 'ENDE'
;**************************************************
;
; Erster Wert ist die Verzerrung und die Lautstärke
; Der zweite Wert gibt an, was mit dem Dritten Wert
; gemacht werden soll
; $00   = Dritten Wert zur Frequenz addieren
; $01 = Dritter Wert überschreibt die Frequenz
; $02   = Dritten Wert zur Frequenz subtrahieren
; $03   = Dritten Wert Zeilen zurück springen

HUELL0 .byte $A8,$00,$00 .byte ENDE

  .end
Antworten

Prodehl schrieb: ...macht dein Konvertierungsprogramm direkt einen Basston mit der Basstabelle daraus....

Hallo!

Theoretisch ist das zwar möglich, aber man darf keine Bassnoten und Normalnoten mischen, da beide schließlich auch unterschiedliche Hüllkurven/Verzerrungen benötigen. Sonst klingt es sche.... Aktuell hast Du die Möglichkeit entweder das ganze in den richtigen Bereich zu transponieren und als Normalnoten zu spielen oder als Bassnoten mit entsprechender Verzerrung. Vorallem erkennst Du, dass Deine Eingabe einen falschen Bereich definiert. Bei einem automatischen transponieren wunderst Du Dich ggf. warum sich alles gleich anhört.

Automatismus ist immer so eine Sache finde ich. Meistens Bequem und manchmal dann ganz schön lästig :-) Hier haben wir wahrscheinlich unterschiedliche Erfahrungen gesammelt. Ich mag lieber möglich viel in einen Prozess eingreifen und bestimmen können.

Freut mich, dass Dir das Ergebnis schon gefällt.

Grüße und einen schönen Schneetag Janko

Antworten

Was mir aufgefallen ist, dass zwar immer mehr MIDI-Dateien sich umsetzen lassen, es aber immer wieder Probleme mit Dateien gibt. Mein vorrangiges Ziel wird es daher ersteinmal sein, möglichst viele Ausnahmen zu erkennen und wenn möglich abzufangen. Wäre ja wirklich toll, wenn fast jedes Midi sich umsetzen lässt.

Auch ein Problem, was sich aber nicht lösen lässt, ist die Melodie führende Spur. Bei Midi gibt es so eine Spur nicht, sondern die Noten wechseln innerhalb eines Kanals hin und her. Ich habe Barbie Girl von Auqa umgesetzt und erst als ich wirklich 4 Stimmen genutzt habe, konnte man die Melodie erkennen. Der Rest waren ständig Arkkorde :-) Erst dachte ich: "Mist, klappt alles nicht", aber nachdem die 4 Stimme auch eingepflegt war kam eine Aha-Erlebnis.

Grüße Janko

Antworten

Schick mir mal bitte per Email so ein file zum Testen.

Grüße Janko

Antworten

...ich hoffe, ich nerve nicht, aber mir ist noch aufgefallen, daß die Konvertierung der Bass-Tabelle ab C2 nicht mehr funktioniert... vielleicht mache ich ja auch was falsch bei der Eingabe, aber für C1 und C2 beispielsweise bekomme ich den gleichen Wert: $BF C2 müsste aber 5F sein und auch danach also von C2 bis C3 funktioniert die Konvertierung nicht so richtig...

Antworten

Hallo Peter!

Heute war nicht so mein Tag, weshalb ich eigentlich nur geschlafen habe und Dir nicht antworten konnte. Die Engine ist immer gleich, aber natürlich kann man die Notenlängen individuell anpassen:

musikengine1.png

Bei Deinem Sound ist die Dauer auf 6 eingestellt, bei meinem meistens 4 (= schneller). Die Toccata läuft mit 64stl-Noten und benötigt natürlich eine ganz andere Aufteilung. Das muss man individuell anpassen. Ist ja auch in der Musik so... mal ist eine 1/4 Note extrem kurz und mal sehr lang.

Auch sind die Hüllkurven bei jedem Lied anzupassen. Klar kann man diese oft weiterverwenden, aber wenn ich Sie nicht benötige, können diese weg = Speicherplatz sparen. Es macht keinen Sinn immer mehrere Hüllkurven im Programm mit herumzuschleppen, wenn man nur eine benötigt. Deshalb bin ich auch nicht ganz so für das Konzept "Eierlegendewollmilchsau". Die Engine soll schon Einiges können, aber dabei immer möglichst schlank bleiben.

Das Midi-File konnte ich noch nicht anschauen... mach ich aber noch.

Grüße Janko

Antworten

Hallo!

Doppelte Noten gehen eigentlich mittlerweile ganz gut, es werden einfach zwei Kanäle erzeugt. Es gab Probleme mit den Pausen... Jetzt habe ich es aber angepasst und auch eine Möglichkeit geschaffen, dass fehlerhafte Track angezeigt werden.

Grüße Janko

Antworten

Hi!

Mein Spiel kommt gar nicht voran... da ich mich ja nun um diese Midi-Geschichte gekümmert habe. Aber da nun ein Termin (31.7.) vorgegeben ist, werde ich wohl langsam wieder die Prio auf das Spiel wechseln müssen.

Dein Ansatz, die MUSPLAY zu verändern ist meines erachtens der Falsche. Du musst Dich um MUSINI kümmern, da dort ja die Musik initialisiert und dann per MUSPLAY abgespielt wird. Wenn DU MUSINI mitteilen könntest, dass STIMME 1-3 Dein Lied sind und eingerichtet werden sollen, wird per MUSPLAY die Musik abgespielt. Wenn Du nun per MUSINI Stimme 4 mit einem Effekt belegst, wird dieser 1x über MUSPLAY abgespielt. Also ist Dein Ziel MUSINI so anzupassen, dass Du bei Bedarf Stimme 4 immer mit einem Effekt belegen kannst. MUSPLAY wird im VBI permanent aufgerufen und tut nur, was MUSINI will.

Grüße Janko

Antworten

Hi!

Ja ich programmiere viel, deshalb kenne ich mich aber leider nicht mit den Tipps&Tricks beim ATARI aus. Da bin ich auf Hilfe angewiesen. Mit "Return to Phobos" hast Du mich immer wieder beeindruckt und mich angespornt selber weiter zu kommen. Ich hoffe, dass RtP beim Software-Wettbewerb zugelassen wird, da es ja schließlich nicht veröffentlicht wurde. Sag mir bitte Bescheid, was Du bei der Nomam erfahren kannst.

Grüße Janko

Antworten

Hallo Peter!

Du hast geschrieben, dass zusammen mit der Musik bei 60Hz es Probleme gibt. Ich habe überlegt und die Engine ein wenig optimiert.

Alt: - Es wurden immer alle möglichen Kommandos geprüft, bevor die Note verarbeitet wurde. Neu: - Es wird geprüft, ob es ein Kommando ist, wenn nein geht sofort die Notenverarbeitung weiter. Da Kommandos nicht so oft vorkommen, sollte das insgesamt den Code schneller machen.

Alt: - Bei der Hüllkurve mit Kommando 0 wurde immer der Dritte Byte auf die Frequenz addiert. Also in der Regel immer 0 Neu: - Bei Kommando 0 wird sofort die Hüllkurve weiterbearbeitet und nichts addiert. Die Kommandos haben aber dadurch neue Zuordnungen erhalten.

Ob es hilft, kann ich nicht sagen. Aber im Normalfall sollten nun weniger Rechenzyklen benutzt werden.

Grüße Janko

  org $2000

  icl 'Systemkonstanten.asm'

  .proc main

  jsr TitelMusik.MUSINI

?mainloop lda RTCLOK+2 ?loop cmp RTCLOK+2
beq ?loop

        jsr TitelMusik.MUSPLAY  ; Muss alle 1/50 Sekunde aufgerufen werden (z.B. im VBI)

        jmp ?mainloop

        .end

        run main

; ; ;************ ; Musik-Generator V1.2 vom 04.04.2022 (2314) ; ;** .proc TitelMusik

;
;**************************************************
; Interne Variablen fuer MUSIK
;**************************************************
;

CSREGL EQU $CE ; Zeropageregister CSREGH EQU $CF

;**************************************************
; VBI-Routine, alle 1/50sec. aufgerufen
;**************************************************
;

MUSPLAY LDX #0 ; Kanal 0 zuerst spielen MUNXKN STX MUKANAL ; Kanal merken JSR MUXPLY ; Ton für Stimme holen JSR MUXHUL ; Huellkurve f. eine Stimme holen JSR MUPLAY ; Ton/Huellkruve spielen INX ; naechste Stimme CPX #4 ; schon alle 4 Stimmen? BNE MUNXKN ; nein --> ; RTS ; ;******* ; Initialisierungsroutine ; POKEY init., Variable loeschen, VBI setzen ;******* ; MUSINI LDA #0 ; POKEY und Variablen loeschen LDX #3 ; je 4 Register ; MUSEN1 STA AUDF1,X ; AUDF/C 1/2 STA AUDF1+4,X ; AUDF/C 3/4 STA MUDUR1,X ; Tondauer:=0 STA MUHPT1,X ; Huellk.-Zeiger:=Tabellenanfang DEX ; schon alle 4? BPL MUSEN1 ; nein, nochmal --> ; ; LDA #3 ; Pokey ruecksetzen STA SKCTL LDA #$0 ; Sound-Kontrollreg. zurueck STA AUDCTL ; LDX #$00 ; Setzen der einzelnen Zeiger LDA #STIMM1 ; Entspricht ein Rücksetzen STA STMTBH,X ; der Musik INX LDA #STIMM2 STA STMTBH,X
INX LDA #STIMM3 STA STMTBH,X
INX LDA #STIMM4 STA STMTBH,X
; RTS ; ;******* ; VBI ausschalten ; Vektor wird auf alten Wert zurueckgesetzt ;******* ; MUSAUS LDA #0 ; Sound aus! LDX #3 ; alle 4 Kanaele MUSAU1 STA AUDF1,X ; AUDF/C 1/2 STA AUDF1+4,X ; AUDF/C 3/4 DEX ; schon alle 4? BPL MUSAU1 ; nein, nochmal --> MUXPEN RTS ; ;******* ;Einen Kanal spielen ;pruefen der Tondauer, evtl. neue Note besorgen, ;Test auf ENDE, START, PAUSE ;******* ; MUXPLY LDA MUDUR1,X ; ist Kanal noch aktiv? BEQ MUXNEU ; nein, dann neue Note ; DEC MUDUR1,X ; sonst nur Tondauer - 1 BNE MUXPEN ; Ton laeuft noch ---> ; MUXNEU LDA #0 ; Flag fuer Pause vorerst STA MUPAU1,X ; zuruecknehmen STA MUHPT1,X ; Huellk. Zeiger auf Anf. LDA STMTBL,X ; Basisadresse der Noten STA CSREGL ; tabelle in Zeropage LDA STMTBH,X ; register umspeichern STA CSREGH ; LDY #0 ; Zeiger in Notentabelle LDA (CSREGL),Y ; Tonhoehe der Note ; CMP #$FA ; Kommt ein Kommando BCS MUXCMD ; Ja, dann Kommando abfragen JMP MUXWRK ; Nein, dann Note bearbeiten

MUXCMD CMP #START ; ist START-Befehl? BNE MUXN1 ; nein ---> JSR MUSINI LDX #$00
JMP MUXNEU ; MUXN1 CMP #ENDE ; ist ENDE-Befehl? BEQ MUXPAU ; ja, dann Pause imitieren --> ; CMP #LOOP ; Loop? BNE MUXN2 ; Nein, dann weiter MUXN2 JMP MULOOP ; MUXN2 CMP #HUELLKURVE ; Huellkruve wechseln?
BNE MUXWRK LDY #$01
LDA (CSREGL),Y ; gewünschte Kurve lesen STA MUHUELL,X ; und setzen JSR MUXNXT JMP MUXNEU

;

MUXWRK PHA ; Tonhoehe merken LDY #$01
LDA (CSREGL),Y ; Dauer aus Notentabelle lesen STA MUDUR1,X ; in Zaehler f. Notendauer

  JSR MUXNXT
;
  PLA       ; Tonhoehe wieder holen
  CMP #PAUSE      ; war es ein PAUSE Befehl?
  BEQ MUXPAU      ; ja ,dann Pausenbearbeitung
;
  STA STTON,X
  RTS
;

MUXPAU LDA #PAUSE ; Huellk. ausschalten STA MUPAU1,X RTS ;
MUXNXT CLC LDA STMTBL,X ; Noten Zeiger auf ADC #$02 ; naechste Note richten STA STMTBL,X ; und abspeichern LDA STMTBH,X
ADC #$00 STA STMTBH,X
RTS

MULOOP LDY #$01
LDA (CSREGL),Y ; zweites Byte lesen BNE MULOOP1 ; = 0? Dann weiter DEC MULOOPCNT,X LDA MULOOPCNT,X BNE @+ ; Zähler ungleich 0 -> @ JSR MUXNXT ; nächste Note holen JMP MUXNEU ; und abspielen

@ LDA MULOOPADRL,X ; gemerkte Adresse STA STMTBL,X ; holen und abspielen LDA MULOOPADRH,X STA STMTBH,X
JMP MUXNEU ; Neue Adresse abspielen

MULOOP1 STA MULOOPCNT,X ; Loop-Zähler setzen JSR MUXNXT ; Adresszähler erhöhen LDA STMTBL,X ; holen und abspielen STA MULOOPADRL,X ; gemerkte Adresse LDA STMTBH,X
STA MULOOPADRH,X JMP MUXNEU ; Nächste Note holen und abspielen

;
;**************************************************
; Huellkurvengenerator
; Lautstaerke fuer einen Kanal wird gemaess
; Huellkurve eingestellt
;**************************************************
;

MUXHUL LDA STTON,X STA MUTEMP

  LDA MUPAU1,X      ; Flag fuer Pause?
  CMP #PAUSE      ; ist auf Pause?
  BNE MUXH0     ; nein, normale Huellk.
;
  LDA #0        ; Pause Lautstaerke auf Null
  STA STDIS,X     ; Lautst. merken
  BEQ MUXHEN      ; (immer!) an Pokey -->
;

MUXH0 LDA MUHUELL,X TAX LDA MHLTBL,X ; Huellkurven Basisadresse STA CSREGL ; in Zeropage Register LDA MHLTBH,X ; MSB STA CSREGH LDX MUKANAL LDY MUHPT1,X ; aktueller Zeiger in Hk. LDA (CSREGL),Y ; neuer Stuetzpunkt CMP #ENDE ; ist Huellk. zu Ende? BEQ MUXHEN ; ja, dann fertig! STA STDIS,X

MUDIS INY LDA (CSREGL),Y ; CMD = 0 Ton unverändert nutzen BNE MUXH1 INY JMP MUXHNX

MUXH1 CMP #$01 ; CMD = 1 Ton übernehmen BNE MUXH2 INY LDA (CSREGL),Y STA MUTEMP JMP MUXHNX

MUXH2 CMP #$02 ; CMD = 2 Ton addieren BNE MUXH3 INY CLC LDA STTON,X ADC (CSREGL),Y STA MUTEMP JMP MUXHNX

MUXH3 CMP #$03 ; CMD = 3 Ton subtrahieren BNE MUXH4 INY SEC LDA STTON,X SBC (CSREGL),Y STA MUTEMP JMP MUXHNX

MUXH4 CMP #$04 ; CMD = 4 Zeiger zurück BNE MUXH5 INY TYA SEC SBC (CSREGL),Y SBC (CSREGL),Y SBC (CSREGL),Y SBC #$02 TAY JMP MUDIS

MUXH5 INY ; Stuetzpunkt merken MUXHNX INY ; HK-Zeiger weiterschalten TYA ; und abspeichern STA MUHPT1,X

MUXHEN RTS

MUPLAY TXA ; Offset fuer Pokey-Register ASL ; A Index mal 2 TAY LDA MUTEMP STA AUDF1,Y LDA STDIS,X STA AUDC1,Y ; an POKEY geben

  RTS

;
;**************************************************
;Speicherzellen einzelner Zeiger und Noten
;**************************************************
;

STTON .byte $00,$00,$00,$00 ; Speicher für Tonhöhe STDIS .byte $00,$00,$00,$00 ; Speicher für Lautstärke/Verzerrung MUDUR1 .byte $00,$00,$00,$00 ; Zaehler fuer Tondauer MUPAU1 .byte $00,$00,$00,$00 ; Flag fuer Pause MUHPT1 .byte $00,$00,$00,$00 ; Zeiger in Huellkurve MUHUELL .byte $00,$01,$02,$03 ; Zeiger auf verwendete Huellkruve MULOOPADRL .byte $00,$00,$00,$00 ; Loop-Addr LO merken MULOOPADRH .byte $00,$00,$00,$00 ; Loop-Addr HI merken MULOOPCNT .byte $00,$00,$00,$00 ; Loop-Zähler MUKANAL .byte $00 ; Aktueller Kanal MUTEMP .byte $00 ; Temporäre Daten

;
;***************************************************
;Definition der einzelnen Tonlängen
;Sechszehntel ist die kürzeste Länge
;***************************************************
;

PAUSE EQU $ff ; Code f. Pause P EQU PAUSE ; Kuerzel f. Pause START EQU $fe ; Code fuer Musik-Neubeginn ENDE EQU $fd ; Code fuer Stimmende HUELLKURVE EQU $fc ; Code fuer Huellkurve K EQU HUELLKURVE ; Kuerzel f. Huellkruve LOOP EQU $fb ; Code für einen Loop L EQU LOOP ; Kuerzel f. Loop ; DAUER EQU 7 ; Dauer eines 16tel ; V EQU DAUER16 ; H EQU DAUER8 ; Halbe Note Q EQU DAUER4 ; Viertel Note (Quarter) E EQU DAUER2 ; Achtel Note (Eight) S EQU DAUER ; Sechzehntel Note

; 
;***************************************************
;Speicherstellen der einzelnen Zeiger  
;der Notentabellen
;***************************************************
;

STMTBL .BYTE STIMM1,>STIMM2,>STIMM3,>STIMM4

; 
;***************************************************
;Definition der zu nutzenden Hüllkurven  
;***************************************************
;

MHLTBL .BYTE HUELL0,>HUELL1,>HUELL2,>HUELL3,>HUELL4

;**************************************************
; HUELLKURVENTABELLEN
; Hier werden Stuetzpunkte der Huellkurven
; als Lautstaerkewerte eingetragen
; jede Tabelle beginnt mit HUELL<n>
; und endet mit 'ENDE'
;**************************************************
;
; Erster Wert ist die Verzerrung und die Lautstärke
; Der zweite Wert gibt an, was mit dem Dritten Wert
; gemacht werden soll
; $00   = Dritten Wert wird nicht berücksichtigt
; $01 = Dritter Wert überschreibt die Frequenz
; $02 = Dritter Wert wird zur Frequenz addiert
; $03 = Dritter Wert wird von der Frequenz subtrahiert 
; $04 = Dritter Wert die Schritte eines Loop zurück an

STIMM1 .BYTE K,0 .byte P,V .byte P,V .byte P,V .byte P,V .byte $51,S,P,S,$66,S,$5b,S,$51,H,P,Q .byte $4c,S,P,S,$60,S,$55,S,$4c,H,P,Q .byte $51,S,P,S,$66,S,$5b,S,$51,H,P,S,$66,S,$5b,S,$51,S .byte $4c,Q+E,$79,E,$80,E,$6c,Q+E .byte $51,S,P,S,$66,S,$5b,S,$51,H,P,Q .byte $4c,S,P,S,$60,S,$55,S,$4c,H,P,Q .byte $51,S,P,S,$66,S,$5b,S,$51,H,P,S,$66,S,$5b,S,$51,S .byte $4c,Q+E,$79,S,P,S,$80,Q,$51,E,P,E .byte $3c,H,$40,H .byte $3c,S,P,S,$48,S,$3c,S,$40,H+E+S,P,S .byte $3c,H,$40,H .byte $48,S,$40,S,$3c,S,P,S,$6c,H+E+S,P,S .byte $51,S,P,S,$60,S,$5b,S,$51,H,P,Q .byte $48,S,P,S,$5b,S,$51,S,$48,H,P,Q .byte $3c,S,P,S,$48,S,$40,S,$3c,Q,P,E,$35,Q,$3c,S,P,S .byte $3c,H+Q+E+S,P,S .byte $28,S,P,S,$32,S,$2d,S,$28,H,P,Q .byte $25,S,P,S,$2f,S,$2a,S,$25,H,P,Q .byte $28,S,P,S,$32,S,$2d,S,$28,H,P,S,$32,S,$2d,S,$28,S .byte $25,Q+E,$3c,E,$40,E,$35,Q+E .byte $28,S,P,S,$32,S,$2d,S,$28,H,P,Q .byte $25,S,P,S,$2f,S,$2a,S,$25,H,P,Q .byte $28,S,P,S,$32,S,$2d,S,$28,H,P,S,$32,S,$2d,S,$28,S .byte $25,Q+E,$3c,S,P,S,$40,Q,$28,E,P,E .byte $3c,H,$40,H .byte $3c,S,P,S,$48,S,$3c,S,$40,H+E+S,P,S .byte $3c,H,$40,H .byte $48,S,$40,S,$3c,S,P,S,$6c,H+E+S,P,S .byte $51,S,P,S,$60,S,$5b,S,$51,H,P,Q .byte $48,S,P,S,$5b,S,$51,S,$48,H,P,Q .byte $3c,S,P,S,$48,S,$40,S,$3c,Q,P,E,$35,Q,$3c,S,P,S .byte $3c,H+E+S,P,S,$3c,E,P,E .byte ENDE

STIMM2 .BYTE ENDE

STIMM3 .BYTE K,2 .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $b6,E,P,E,$b6,E,P,E,$b6,E,P,E,$b6,E,P,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $aa,E,P,E,$aa,E,P,E,$80,E,P,E,$80,E,P,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $b6,E,P,E,$b6,E,P,E,$b6,E,P,E,$b6,E,P,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $aa,E,P,E,$aa,E,P,E,$80,E,P,E,$80,E,P,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $b6,E,P,E,$b6,E,P,E,$b6,E,P,E,$b6,E,P,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $aa,E,P,E,$aa,E,P,E,$80,E,P,E,$80,E,P,E .byte $8f,E,$71,E,$8f,E,$71,E,$8f,E,$80,E,$8f,E,$80,E .byte $8f,E,$71,E,$8f,E,$80,E,$8f,E,$80,E,$8f,E,$80,E .byte $8f,E,$71,E,$8f,E,$71,E,$8f,E,$80,E,$8f,E,$80,E .byte $8f,E,$71,E,$80,E,$aa,E,$80,E,$aa,E,$80,E,$aa,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $8f,E,P,E,$8f,E,P,E,$8f,E,P,E,$8f,E,P,E .byte $aa,E,P,E,$aa,E,P,E,$80,E,$80,Q,$80,S,P,S .byte $5f,Q,$5f,E,$80,E,$5f,E,$80,E,$5f,E,$80,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $b6,E,P,E,$b6,E,P,E,$b6,E,P,E,$b6,E,P,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $aa,E,P,E,$aa,E,P,E,$80,E,P,E,$80,E,P,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $b6,E,P,E,$b6,E,P,E,$b6,E,P,E,$b6,E,P,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $aa,E,P,E,$aa,E,P,E,$80,E,P,E,$80,E,P,E .byte $8f,E,$71,E,$8f,E,$71,E,$8f,E,$80,E,$8f,E,$80,E .byte $8f,E,$71,E,$8f,E,$80,E,$8f,E,$80,E,$8f,E,$80,E .byte $8f,E,$71,E,$8f,E,$71,E,$8f,E,$80,E,$8f,E,$80,E .byte $8f,E,$71,E,$80,E,$aa,E,$80,E,$aa,E,$80,E,$aa,E .byte $bf,E,P,E,$bf,E,P,E,$bf,E,P,E,$bf,E,P,E .byte $8f,E,P,E,$8f,E,P,E,$8f,E,P,E,$8f,E,P,E .byte $aa,E,P,E,$aa,E,P,E,$80,E,$80,Q,$80,S,P,S .byte $5f,H+E+S,P,S,$bf,E,P,E .BYTE ENDE

STIMM4 .byte K,4 .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S .byte $d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S .byte $d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,P,E+S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,E,$d9,S,$d9,S,$d9,E .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S .byte $d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S .byte $d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,E,$d9,E,$d9,S,$d9,S,$d9,E,$d9,E,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S .byte $d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,$d9,S,P,E+S .BYTE ENDE

;**************************************************
; HUELLKURVENTABELLEN
; Hier werden Stuetzpunkte der Huellkurven
; als Lautstaerkewerte eingetragen
; jede Tabelle beginnt mit HUELL<n>
; und endet mit 'ENDE'
;**************************************************
;
; Erster Wert ist die Verzerrung und die Lautstärke
; Der zweite Wert gibt an, was mit dem Dritten Wert
; gemacht werden soll
; $00   = Dritten Wert zur Frequenz addieren
; $01 = Dritter Wert überschreibt die Frequenz

HUELL0 .BYTE $A8,$00,$00 .BYTE ENDE

HUELL1 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $A8,$00,$00 .BYTE $00,$00,$00 .BYTE ENDE

HUELL2 .BYTE $C8,$00,$00 .BYTE $C8,$00,$00 .BYTE $C8,$00,$00 .BYTE $C6,$00,$00 .BYTE $C6,$00,$00 .BYTE $C6,$00,$00 .BYTE $C6,$00,$00 .BYTE $C6,$00,$00 .BYTE $C4,$00,$00 .BYTE $C4,$00,$00 .BYTE $C4,$00,$00 .BYTE $C4,$00,$00 .BYTE $C3,$00,$00 .BYTE $C3,$00,$00 .BYTE $C3,$00,$00 .BYTE $C3,$00,$00 .BYTE $00,$00,$00 .BYTE ENDE

HUELL3 .BYTE $88,$00,$00 .BYTE $87,$00,$00 .BYTE $84,$00,$00 .BYTE $82,$00,$00 .BYTE $00,$00,$00 .BYTE ENDE

HUELL4 .BYTE $88,$01,$00 .BYTE $86,$01,$01 .BYTE $85,$01,$01 .BYTE $84,$01,$01 .BYTE $83,$01,$01 .BYTE $82,$01,$01 .BYTE $00,$01,$00 .BYTE ENDE

  .end
Antworten

Hallo!

Der Engine ist es egal, ob es ein 4/4 Takt oder 3/4 Takt ist. Sie spielt einfach die Noten ab, die da kommen. Lediglich der BPM muss in Form der Dauer der Noten ggf. angepasst werden.

Grüße Janko

Antworten

Hallo!

Freut mich, dass die Nomam geklappt hat und Spaß gemacht hat. Konntest Du denn nun in Erfahrung bringen, ob RtP am Softwarewettbewerb teilnehmen darf? Wäre doch schade wenn nicht.

Danke, dass Du mein Midi-Projekt erwähnt hast. Aber ich denke wirklich interessant ist es nur, wenn man bei Matthias sich ein Lied komponieren lässt.

Grüße Janko

Antworten

Hi!

Hab Dir schon per E-Mail geantwortet, dass die drei Midis jetzt angekommen sind. Im Spam-Ordner ist bei mir nichts, und der wird nicht automatisch gelöscht. Egal, ist jetzt da.

Janko

Antworten

Hallo!

Habe mal auf die schnelle das Midi umgesetzt. Man musste ein wenig mit den Einstellung spielen.

Lead = 64stel, 480, ja, nein Rest = 32stel, wie Midi, ja nein

Den Bass muss man eine Oktave nach oben transponieren.

Grüße Janko

Antworten

Hallo!

Hab Dir eben noch eine Überarbeitung zugesendet. Naja, vielleicht gefällt es Dir :-)

Janko

Antworten

Hast Du meine ASM so wie sie ist schon abgespielt? Ich finde, die Hüllkurven passen doch ganz gut. Nur etwas schnell... wegen der 64stel Noten. Habe sogar versucht den Klangeffekt ein wenig einzufangen.

Aber natürlich sollst Du es so anpassen, wie es Dir gefällt.

Grüße Janko

Antworten

Hallo!

Lead hat ja zwei Kanäle. Die müssen beide gleichzeitig gespielt werden, da es sonst seltsam klingt.

Grüße

Antworten

hmmm ... aber dann habe ich ja in jeder Stimme 2 Kanäle - also brauche ich 6 Stimmen ...das geht doch nicht! Da habe ich einen Denkfehler??!!

Antworten

ich habe dir mal meinen kläglichen Versuch gesendet... vielleicht bekommst. du es ja besser hin Gruß Peter

Antworten

Ich habe jetzt die Dauer auf 3 gesetzt und spiele die Musik 2x ab.... ist immer noch etwas langsamer als das Original, klingt aber fast gut....

Antworten

Bildschirmfoto 2022-04-12 um 09.48.11.png

ich meine diesen Part, wo die Note so "runtergezogen" wird

Antworten

Moin, bin noch im Bett :D

In meiner Umsetzung sind 2 verschiedene drums, die sich passend abwechseln und diese pitch-Geschichte enthalten. Habe 5 verschiedenen hullkurven genutzt.

Hast das nicht gesehen bzw. gehört?

Die engine kann das nämlich alles 8-)

Ich stehe jetzt mal auf :mrgreen:

Grüße

Antworten

Hatte dir 2 Emails mit assembler Anhang gesendet gehabt. In der 2. War dieses pitch enthalten, wenn auch nicht ganz so geil wie im original.

Antworten

Hallo Peter,

hier noch einmal das komplette Lied von Dir mit meiner aktuellsten Engine, mit der Verzögerung und einer erweiterten Möglichkeit wg. der Soundveränderung. Die Hüllkurve 4 war mir einfach zu lang und musste angepasst werden :-)

  org $2000

  icl 'Systemkonstanten.asm'

  .proc main

  jsr TitelMusik.MUSINI

?mainloop lda RTCLOK+2 ?loop cmp RTCLOK+2
beq ?loop

        jsr TitelMusik.MUSPLAY  ; Muss alle 1/50 Sekunde aufgerufen werden (z.B. im VBI)

        jmp ?mainloop

        .end

        run main

; ; ;************ ; Musik-Generator V1.4 vom 12.04.2022 (1505) ; ; ; V1.0 generelle Engine ; V1.1 vom 31.03.2022 ; Möglichkeit die Hüllkruve mit einem Loop zu versehen ; V1.2 vom 04.04.2022 ; Hüllkurven Kommandos geändert ; V1.3 vom 06.04.2022 ; Man kann nun MusikSets erzeugen und so unterschiedliche Musik abspielen ; V1.4 vom 12.04.2022 ; Man kann per MUDELAY die Musikgeschwindigkeit beeinflussen / PITCH erweitert um Kommando 5 und 6 ;**

  .proc TitelMusik

;
;**************************************************
; Interne Variablen fuer MUSIK
;**************************************************
;

CSREGL EQU $CE ; Zeropageregister CSREGH EQU $CF

;**************************************************
; VBI-Routine, alle 1/50sec. aufgerufen
;**************************************************
;

MUSPLAY INC MUDELAY ; Musik verzögern LDA MUDELAY CMP MUMAXDELAY BNE @+ LDA #0 STA MUDELAY @ CMP #1 BNE @+ RTS

@ LDX #0 ; Kanal 0 zuerst spielen MUNXKN STX MUKANAL ; Kanal merken JSR MUXPLY ; Ton für Stimme holen JSR MUXHUL ; Huellkurve f. eine Stimme holen JSR MUPLAY ; Ton/Huellkruve spielen INX ; naechste Stimme CPX #4 ; schon alle 4 Stimmen? BNE MUNXKN ; nein --> ; RTS ; ;******* ; Initialisierungsroutine ; POKEY init., Variable loeschen, VBI setzen ;******* ; MUSINI LDA #0 ; POKEY und Variablen loeschen LDX #3 ; je 4 Register ; MUSEN1 STA AUDF1,X ; AUDF/C 1/2 STA AUDF1+4,X ; AUDF/C 3/4 STA MUDUR1,X ; Tondauer:=0 STA MUHPT1,X ; Huellk.-Zeiger:=Tabellenanfang DEX ; schon alle 4? BPL MUSEN1 ; nein, nochmal --> ; ; LDA #3 ; Pokey ruecksetzen STA SKCTL LDA #$0 ; Sound-Kontrollreg. zurueck STA AUDCTL ; LDA MUWAHL ; Welches Notenset holen? ASL ; x8 für 4 Stimmen Lo/Hi ASL ASL TAY

  LDA MUSIKSET,Y      ; Setzen der einzelnen Zeiger 
  STA STMTBL      ; der Stimmen
  LDA MUSIKSET+1,Y    ; Entspricht ein Rücksetzen
  STA STMTBH      ; der Musik

  LDA MUSIKSET+2,Y
  STA STMTBL+1
  LDA MUSIKSET+3,Y
  STA STMTBH+1

  LDA MUSIKSET+4,Y
  STA STMTBL+2
  LDA MUSIKSET+5,Y
  STA STMTBH+2

  LDA MUSIKSET+6,Y
  STA STMTBL+3
  LDA MUSIKSET+7,Y
  STA STMTBH+3  
;
  RTS
;
;**************************************************
; VBI ausschalten
; Vektor wird auf alten Wert zurueckgesetzt
;**************************************************
;

MUSAUS LDA #0 ; Sound aus! LDX #3 ; alle 4 Kanaele MUSAU1 STA AUDF1,X ; AUDF/C 1/2 STA AUDF1+4,X ; AUDF/C 3/4 DEX ; schon alle 4? BPL MUSAU1 ; nein, nochmal --> MUXPEN RTS ; ;******* ;Einen Kanal spielen ;pruefen der Tondauer, evtl. neue Note besorgen, ;Test auf ENDE, START, PAUSE ;******* ; MUXPLY LDA MUDUR1,X ; ist Kanal noch aktiv? BEQ MUXNEU ; nein, dann neue Note ; DEC MUDUR1,X ; sonst nur Tondauer - 1 BNE MUXPEN ; Ton laeuft noch ---> ; MUXNEU LDA #0 ; Flag fuer Pause vorerst STA MUPAU1,X ; zuruecknehmen STA MUHPT1,X ; Huellk. Zeiger auf Anf. LDA STMTBL,X ; Basisadresse der Noten STA CSREGL ; tabelle in Zeropage LDA STMTBH,X ; register umspeichern STA CSREGH ; LDY #0 ; Zeiger in Notentabelle LDA (CSREGL),Y ; Tonhoehe der Note ; CMP #$FA ; Kommt ein Kommando BCS MUXCMD ; Ja, dann Kommando abfragen JMP MUXWRK ; Nein, dann Note bearbeiten

MUXCMD CMP #START ; ist START-Befehl? BNE MUXN1 ; nein ---> JSR MUSINI LDX #$00
JMP MUXNEU ; MUXN1 CMP #ENDE ; ist ENDE-Befehl? BEQ MUXPAU ; ja, dann Pause imitieren --> ; CMP #LOOP ; Loop? BNE MUXN2 ; Nein, dann weiter MUXN2 JMP MULOOP ; MUXN2 CMP #HUELLKURVE ; Huellkruve wechseln?
BNE MUXWRK LDY #$01
LDA (CSREGL),Y ; gewünschte Kurve lesen STA MUHUELL,X ; und setzen JSR MUXNXT JMP MUXNEU

;

MUXWRK PHA ; Tonhoehe merken LDY #$01
LDA (CSREGL),Y ; Dauer aus Notentabelle lesen STA MUDUR1,X ; in Zaehler f. Notendauer

  JSR MUXNXT
;
  PLA       ; Tonhoehe wieder holen
  CMP #PAUSE      ; war es ein PAUSE Befehl?
  BEQ MUXPAU      ; ja ,dann Pausenbearbeitung
;
  STA STTON,X
  RTS
;

MUXPAU LDA #PAUSE ; Huellk. ausschalten STA MUPAU1,X RTS ;
MUXNXT CLC LDA STMTBL,X ; Noten Zeiger auf ADC #$02 ; naechste Note richten STA STMTBL,X ; und abspeichern LDA STMTBH,X
ADC #$00 STA STMTBH,X
RTS

MULOOP LDY #$01
LDA (CSREGL),Y ; zweites Byte lesen BNE MULOOP1 ; = 0? Dann weiter DEC MULOOPCNT,X LDA MULOOPCNT,X BNE @+ ; Zähler ungleich 0 -> @ JSR MUXNXT ; nächste Note holen JMP MUXNEU ; und abspielen

@ LDA MULOOPADRL,X ; gemerkte Adresse STA STMTBL,X ; holen und abspielen LDA MULOOPADRH,X STA STMTBH,X
JMP MUXNEU ; Neue Adresse abspielen

MULOOP1 STA MULOOPCNT,X ; Loop-Zähler setzen JSR MUXNXT ; Adresszähler erhöhen LDA STMTBL,X ; holen und abspielen STA MULOOPADRL,X ; gemerkte Adresse LDA STMTBH,X
STA MULOOPADRH,X JMP MUXNEU ; Nächste Note holen und abspielen

;
;**************************************************
; Huellkurvengenerator
; Lautstaerke fuer einen Kanal wird gemaess
; Huellkurve eingestellt
;**************************************************
;

MUXHEN RTS

MUXHUL LDA STTON,X STA MUTEMP

  LDA MUPAU1,X      ; Flag fuer Pause?
  CMP #PAUSE      ; ist auf Pause?
  BNE MUXH0     ; nein, normale Huellk.
;
  LDA #0        ; Pause Lautstaerke auf Null
  STA STDIS,X     ; Lautst. merken
  BEQ MUXHEN      ; (immer!) an Pokey -->
;

MUXH0 LDA MUHUELL,X TAX LDA MHLTBL,X ; Huellkurven Basisadresse STA CSREGL ; in Zeropage Register LDA MHLTBH,X ; MSB STA CSREGH LDX MUKANAL LDY MUHPT1,X ; aktueller Zeiger in Hk. LDA (CSREGL),Y ; neuer Stuetzpunkt CMP #ENDE ; ist Huellk. zu Ende? BEQ MUXHEN ; ja, dann fertig! STA STDIS,X

MUDIS INY LDA (CSREGL),Y ; CMD = 0 Ton unverändert nutzen BNE MUXH1 INY JMP MUXHNX

MUXH1 CMP #$01 ; CMD = 1 Ton übernehmen BNE MUXH2 INY LDA (CSREGL),Y STA MUTEMP JMP MUXHNX

MUXH2 CMP #$02 ; CMD = 2 Ton addieren BNE MUXH3 INY CLC LDA STTON,X ADC (CSREGL),Y STA MUTEMP JMP MUXHNX

MUXH3 CMP #$03 ; CMD = 3 Ton subtrahieren BNE MUXH4 INY SEC LDA STTON,X SBC (CSREGL),Y STA MUTEMP JMP MUXHNX

MUXH4 CMP #$04 ; CMD = 4 Zeiger zurück BNE MUXH5 INY TYA SEC SBC (CSREGL),Y SBC (CSREGL),Y SBC (CSREGL),Y SBC #$02 TAY JMP MUDIS

MUXH5 CMP #$05 ; CMD = 5 Ton addieren unendlich! BNE MUXH6 INY INC MUHUDELAY LDA MUHUDELAY CMP (CSREGL),Y BNE @+ LDA #0 STA MUHUDELAY INC STTON,X @ JMP MUXHNX

MUXH6 CMP #$06 ; CMD = 6 Ton subtrahieren unendlich! BNE MUXH7 INY INC MUHUDELAY LDA MUHUDELAY CMP (CSREGL),Y BNE @+ LDA #0 STA MUHUDELAY DEC STTON,X @ JMP MUXHNX

MUXH7 INY ; Stuetzpunkt merken MUXHNX INY ; HK-Zeiger weiterschalten TYA ; und abspeichern STA MUHPT1,X

  RTS

MUPLAY TXA ; Offset fuer Pokey-Register ASL ; A Index mal 2 TAY LDA MUTEMP STA AUDF1,Y LDA STDIS,X STA AUDC1,Y ; an POKEY geben

  RTS

;
;**************************************************
;Speicherzellen einzelner Zeiger und Noten
;**************************************************
;

STTON .byte $00,$00,$00,$00 ; Speicher für Tonhöhe STDIS .byte $00,$00,$00,$00 ; Speicher für Lautstärke/Verzerrung MUDUR1 .byte $00,$00,$00,$00 ; Zaehler fuer Tondauer MUPAU1 .byte $00,$00,$00,$00 ; Flag fuer Pause MUHPT1 .byte $00,$00,$00,$00 ; Zeiger in Huellkurve MUHUELL .byte $00,$01,$02,$03 ; Zeiger auf verwendete Huellkruve MULOOPADRL .byte $00,$00,$00,$00 ; Loop-Addr LO merken MULOOPADRH .byte $00,$00,$00,$00 ; Loop-Addr HI merken MULOOPCNT .byte $00,$00,$00,$00 ; Loop-Zähler MUKANAL .byte $00 ; Aktueller Kanal MUWAHL .byte $00 ; Welches Notenset soll genutzt werden MUTEMP .byte $00 ; Temporäre Daten MUDELAY .byte $00 ; Musikverzögerung MUMAXDELAY .byte $05 ; max. Musikverzögerung (0 = aus ; je höher desto schneller) MUHUDELAY .byte $00 ; interne Variable für die Hüllkurve

;
;***************************************************
;Definition der einzelnen Tonlängen
;Sechszehntel ist die kürzeste Länge
;***************************************************
;

PAUSE EQU $ff ; Code f. Pause P EQU PAUSE ; Kuerzel f. Pause START EQU $fe ; Code fuer Musik-Neubeginn ENDE EQU $fd ; Code fuer Stimmende HUELLKURVE EQU $fc ; Code fuer Huellkurve K EQU HUELLKURVE ; Kuerzel f. Huellkruve LOOP EQU $fb ; Code für einen Loop L EQU LOOP ; Kuerzel f. Loop ; DAUER EQU 1 ; Dauer eines 16tel ; V EQU DAUER64 ; Ganze Note H EQU DAUER32 ; Halbe Note Q EQU DAUER16 ; 4tel Note E EQU DAUER8 ; 8tel Note S EQU DAUER4 ; 16tel Note T EQU DAUER2 ; 32stel Note VS EQU DAUER ; 64stel Note

; 
;***************************************************
;Speicherstellen der einzelnen Zeiger  
;der Notentabellen
;***************************************************
;

STMTBL .byte $00, $00, $00, $00 STMTBH .byte $00, $00, $00, $00

; 
;***************************************************
;Definition der zu nutzenden Noten und Hüllkurven  
;***************************************************
;

MUSIKSET .word PRO_MU1, PRO_MU2, PRO_MU3, PRO_MU4

MHLTBL .byte HUELL0,>HUELL1,>HUELL2,>HUELL3,>HUELL4

;
;***************************************************
;Notentabellen:
;jede Tabelle beginnt mit Label STIMM<n>
;wobei <n>:Nummer der Stimme (1-4)
;danach folgen die Noten (Note,Dauer)
;jeweils in .byte Befehlen.
;nach letzter Note muss 'ENDE' oder
;'START' eingetragen werden.
;'START' startet die gesamte Melodie neu!
;
;Man kann mit K,1 die Hüllkurve 1 auswählen
;Mit L,8 ..... L,0 kann man die Noten 8x wiederholen
;***************************************************
;

PRO_MU1 .byte K,0 .byte P,Q,$5b,Q,$4c,Q,$44,E+T+VS,P,Q
.byte $5b,S+VS,P,E+T+VS,$72,S+VS,$66,E+T+VS,$5b,S+VS,P,E+T+VS,$5b,Q
.byte $5b,H+Q+S+VS,P,V
.byte P,Q,$5b,E+T+VS,P,S+VS,$4c,E+T+VS,$44,S+VS,$3c,E+T+VS,$39,E+S+VS
.byte P,T+VS,$44,S+VS,P,E+T+VS,$4c,S+VS,$44,E+T+VS,$3c,S+VS,P,E+T+VS,$5b,E+S+VS
.byte $5b,H+Q+E,P,V
.byte P,Q,$5b,S+VS,P,S+T,$5b,S+VS,$4c,Q,$44,E+T+VS,P,Q
.byte $5b,S+VS,P,E+T+VS,$72,S+VS,$66,E+T+VS,$5b,S+VS,$4c,E+T+VS,P,Q
.byte P,V
.byte P,V
.byte P,S+VS,$5b,E+T+VS,P,S+VS,$4c,E+T+VS,$44,S+VS,$3c,E+T+VS,$39,E+S+VS,P,T+VS
.byte $32,S+VS,$2d,E+T+VS,P,S+VS,$3c,E+T+VS,P,S+VS,$4c,E+T+VS,P,Q
.byte P,V
.byte P,H+Q+S+VS,$5b,Q
.byte $5b,T+VS,P,T,$5b,T+VS,P,T+VS,$5b,T,P,T+VS,$b5,S+VS,$99,S+T,$88,S+VS,P,Q,$66,S+VS,P,S+T,$44,S+VS .byte P,E+T+VS,$4c,S+VS,P,Q,$88,Q,K,4,$79,V,K,0
.byte $79,T+VS,P,T,$79,T+VS,P,T+VS,$79,T,P,T+VS,$79,T+VS,P,T,$79,T+VS,P,T+VS,$79,T,P,T+VS,$79,T+VS,P,T,$79,T+VS,P,T+VS,$79,T,P,T+VS,$79,T+VS,P,T,$79,T+VS,P,T+VS,$79,T,P,T+VS .byte $5b,Q,$4c,Q,$44,S+VS,P,S+T,$5b,S+VS,$51,S+VS,P,S+T,$79,S+VS
.byte P,Q,$79,E+T+VS,P,S+VS,$79,Q,$5b,E+S+T,P,T
.byte K,4,$79,V,K,0
.byte $79,T+VS,P,T,$79,T+VS,P,T+VS,$79,T,P,T+VS,$79,T+VS,P,T,$79,T+VS,P,T+VS,$79,T,P,T+VS,$79,T+VS,P,T,$79,T+VS,P,T+VS,$79,T,P,T+VS,$79,T+VS,P,T,$79,T+VS,P,T+VS,$79,T,P,T+VS .byte $88,S+VS,$79,S+T,$66,S+VS,$5b,H+Q
.byte P,S+VS,$79,S+T,$66,S+VS,$5b,S+VS,$44,S+T,P,S+VS,$4c,H
.byte P,S+VS,$79,S+T,$66,S+VS,$5b,Q,$51,Q,$4c,E+T+VS,$44,S+VS
.byte P,V
.byte $88,S+VS,$79,S+T,$66,S+VS,$5b,E+T+VS,P,S+VS,$4c,E+T+VS,P,S+VS,$5b,E,P,T+VS,$66,S+VS
.byte P,S+VS,$79,S+T,$66,S+VS,$5b,S+VS,$44,S+T,P,S+VS,$4c,E+T+VS,P,S+VS,$44,E+T+VS,P,S+VS
.byte $88,S+VS,$79,S+T,$66,S+VS,$5b,Q,$51,S+VS,$4c,S+T,$44,S+VS,P,S+VS,$44,S+T,$3c,S+VS
.byte P,V
.byte P,Q,$5b,Q,$4c,Q,$44,E+T+VS,P,Q
.byte $5b,S+VS,P,E+T+VS,$72,S+VS,$66,E+T+VS,$5b,S+VS,P,E+T+VS,$5b,Q
.byte $5b,H+Q+S+VS,P,V
.byte P,Q,$5b,E+T+VS,P,S+VS,$4c,E+T+VS,$44,S+VS,$3c,E+T+VS,$39,E+S+VS
.byte P,T+VS,$44,S+VS,P,E+T+VS,$4c,S+VS,$44,E+T+VS,$3c,S+VS,P,E+T+VS,$5b,E+S+VS
.byte $5b,H+Q+E,P,V
.byte P,Q,$5b,S+VS,P,S+T,$5b,S+VS,$4c,Q,$44,E+T+VS,P,Q
.byte $5b,S+VS,P,E+T+VS,$72,S+VS,$66,E+T+VS,$5b,S+VS,$4c,E+T+VS,P,Q
.byte P,V
.byte P,V
.byte P,S+VS,$5b,E+T+VS,P,S+VS,$4c,E+T+VS,$44,S+VS,$3c,E+T+VS,$39,E+S+VS,P,T+VS
.byte $32,S+VS,$2d,E+T+VS,P,S+VS,$3c,E+T+VS,P,S+VS,$4c,E+T+VS,P,Q
.byte P,V
.byte P,H+Q+S+VS,$5b,S+VS,P,S+T
.byte $2d,S+VS,P,E+T+VS,$32,S+VS,P,E+T+VS,$39,S+VS,P,E+T+VS,$3c,S+VS,P,S+VS,$44,S+T
.byte P,S+VS,$5b,S+VS,$51,S+T,P,S+VS,$66,S+VS,$5b,S+T,P,S+VS,$72,S+VS,P,S+T,$88,S+VS,K,4,$79,V,K,0
.byte P,V
.byte $5b,S+VS,$3c,S+T,$2d,S+VS,P,S+VS,$44,S+T,$32,S+VS,P,S+VS,$4c,S+T,$39,S+VS,P,S+VS,$51,S+T,$3c,S+VS .byte P,Q,$5b,E+T+VS,P,S+VS,$66,E+T+VS,P,S+VS,$72,E+T+VS,P,S+VS
.byte K,4,$79,V,K,0
.byte P,V
.byte $88,S+VS,$79,S+T,$66,S+VS,$5b,H+Q
.byte P,S+VS,$79,S+T,$66,S+VS,$5b,S+VS,$44,S+T,P,S+VS,$4c,H
.byte P,S+VS,$79,S+T,$66,S+VS,$5b,Q,$51,Q,$4c,E+T+VS,$44,S+VS
.byte P,V
.byte $88,S+VS,$79,S+T,$66,S+VS,$5b,E+T+VS,P,S+VS,$4c,E+T+VS,P,S+VS,$5b,E,P,T+VS,$66,S+VS
.byte P,S+VS,$79,S+T,$66,S+VS,$5b,S+VS,$44,S+T,P,S+VS,$4c,E+T+VS,P,S+VS,$44,E+T+VS,P,S+VS
.byte $88,S+VS,$79,S+T,$66,S+VS,$5b,Q,$51,S+VS,$4c,S+T,$44,S+VS,P,S+VS,$44,S+T,$3c,S+VS
.byte P,V
.byte START

PRO_MU2 .byte K,0 .byte P,H+Q+E+T+VS,$51,E+S+VS
.byte P,E,$79,E+T+VS,P,Q+S+VS,$72,E+T+VS,P,E+S+VS
.byte P,V
.byte P,V
.byte P,Q+T+VS,$66,S+VS,P,H+Q
.byte $51,E+T+VS,P,Q+S+VS,$4c,E+T+VS,P,Q+S+VS
.byte P,V
.byte P,V
.byte P,H+E+T+VS,$51,E+S+VS,P,E
.byte $79,E+T+VS,P,H,$5b,Q+S+VS
.byte $5b,H+Q,P,V
.byte P,Q+E+T+VS,$66,S+VS,P,H+Q+E+T+VS
.byte $32,S+VS,P,E+T+VS,$44,S+VS,P,E+T+VS,$5b,H
.byte $5b,H+S+VS,P,V
.byte P,V
.byte P,Q,$72,S+VS,P,E+T+VS,$79,Q,P,Q
.byte P,V
.byte P,V
.byte P,H+S+VS,$51,S+T,P,E+T,$66,S+T,P,S+VS
.byte $88,Q,P,E+T+VS,$88,S+VS,P,H
.byte P,V
.byte P,V
.byte P,V
.byte $88,S+VS,P,Q+S+T,$5b,S+VS,P,H
.byte $88,S+VS,P,H+Q+E+T+VS
.byte $5b,V
.byte P,Q+E+T+VS,$66,S+VS,P,E+T+VS,$66,S+VS,P,Q
.byte $88,S+VS,P,Q+S+T,$5b,S+VS,P,H
.byte P,H+Q,$4c,S+VS,P,E+T+VS
.byte $5b,V
.byte P,H+Q+E+T+VS,$51,E+S+VS
.byte P,E,$79,E+T+VS,P,Q+S+VS,$72,E+T+VS,P,E+S+VS
.byte P,V
.byte P,V
.byte P,Q+T+VS,$66,S+VS,P,H+Q
.byte $51,E+T+VS,P,Q+S+VS,$4c,E+T+VS,P,Q+S+VS
.byte P,V
.byte P,V
.byte P,H+E+T+VS,$51,E+S+VS,P,E
.byte $79,E+T+VS,P,H,$5b,Q+S+VS
.byte $5b,H+Q,P,V
.byte P,Q+E+T+VS,$66,S+VS,P,H+Q+E+T+VS
.byte $32,S+VS,P,E+T+VS,$44,S+VS,P,E+T+VS,$5b,H
.byte $5b,H+S+VS,P,V
.byte P,Q,$66,S+VS,P,E+T+VS,$72,S+VS,P,E+T+VS,$79,S+VS,P,E+T+VS
.byte $4c,S+VS,P,S+T,$4c,S+VS,P,E+T+VS,$5b,S+VS,P,E+T+VS,$66,S+VS,P,S+VS,$79,S+T,P,S+VS
.byte P,V
.byte P,V
.byte P,Q,$66,S+VS,P,E+T+VS,$72,S+VS,P,E+T+VS,$79,S+VS,P,E+T+VS
.byte $4c,E+T+VS,P,H+Q,$88,S+VS
.byte P,V
.byte P,V
.byte P,V
.byte $88,S+VS,P,Q+S+T,$5b,S+VS,P,H
.byte $88,S+VS,P,H+Q+E+T+VS
.byte $5b,V
.byte P,Q+E+T+VS,$66,S+VS,P,E+T+VS,$66,S+VS,P,Q
.byte $88,S+VS,P,Q+S+T,$5b,S+VS,P,H
.byte P,H+Q,$4c,S+VS,P,E+T+VS
.byte $5b,V
.byte P,V
.byte ENDE

PRO_MU3 .byte K,1 .byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T
.byte $8f,S+T,P,S,$80,S+T,$7a,S+T,P,S,$80,S+T,P,E+T,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$a1,S,P,T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S,P,T,$b6,T,P,S,$a1,T,P,T,$8f,S,P,T
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T
.byte $8f,S+T,P,S,$80,S+T,$7a,S+T,P,S,$6b,S+T,P,E+T,$6b,S,P,T,$6b,E,P,T,$80,S,P,T
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$8f,S,P,T,$a1,S+T,P,S,$8f,S+T,P,H
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T
.byte $8f,S+T,P,S,$80,S+T,$7a,S+T,P,S,$80,S+T,P,E+T,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$a1,S,P,T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S,P,T,$b6,T,P,S,$a1,T,P,T,$8f,S,P,T
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T
.byte $8f,S+T,P,S,$80,S+T,$7a,S+T,P,S,$6b,S+T,P,E+T,$6b,S,P,T,$6b,E,P,T,$80,S,P,T
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$8f,S,P,T,$a1,S+T,P,S,$8f,S+T,P,H
.byte $8f,Q,$8f,Q,$6b,S,P,T,$5f,S,$50,S,P,T,$7a,S,P,T,$6b,S,$5c,S,P,T
.byte $50,E+T,P,S+T,$5c,E+T,P,S+T,$5f,E+T,P,S+T,$6b,E+T,P,S+T
.byte $bf,V
.byte $bf,S,P,T,$a1,T,P,T,$80,S,P,T,$7a,E,P,T,$80,S,P,T,$7a,E+S+T,P,T,$80,E+S+T,P,T
.byte $8f,Q+E,P,E,$b6,E+T,P,S+T,$bf,E+T,P,S+T
.byte $da,E+T,P,S+T,$bf,E+T,P,S+T,$da,E+T,P,S+T,$a1,E+T,P,S+T
.byte $bf,V
.byte $bf,T,P,S,$bf,T,P,T,$bf,S,P,T,$bf,T,P,S,$bf,T,P,T,$bf,S,P,T,$bf,T,P,S,$bf,T,P,T,$bf,S,P,T,$bf,T,P,S,$bf,T,P,T,$bf,S,P,T .byte $8f,V
.byte $6b,V
.byte $5f,V
.byte $50,V
.byte P,Q,$8f,E+T,P,S+T,$8f,E+T,P,S+T,$8f,E+T,P,S+T
.byte $6b,E+T,P,S+T,$6b,E+T,P,S+T,$6b,E+T,P,S+T,$6b,E+T,P,S+T
.byte $5f,E+T,P,S+T,$5f,E+T,P,S+T,$5f,E+T,P,S+T,$5f,E+T,P,S+T
.byte $8f,S+T,P,S,$8f,S+T,P,Q,$8f,H
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T
.byte $8f,S+T,P,S,$80,S+T,$7a,S+T,P,S,$80,S+T,P,E+T,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$a1,S,P,T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S,P,T,$b6,T,P,S,$a1,T,P,T,$8f,S,P,T
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T
.byte $8f,S+T,P,S,$80,S+T,$7a,S+T,P,S,$6b,S+T,P,E+T,$6b,S,P,T,$6b,E,P,T,$80,S,P,T
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$8f,S,P,T,$a1,S+T,P,S,$8f,S+T,P,H
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T
.byte $8f,S+T,P,S,$80,S+T,$7a,S+T,P,S,$80,S+T,P,E+T,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$a1,S,P,T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S,P,T,$b6,T,P,S,$a1,T,P,T,$8f,S,P,T
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T
.byte $8f,S+T,P,S,$80,S+T,$7a,S+T,P,S,$6b,S+T,P,E+T,$6b,S,P,T,$6b,E,P,T,$80,S,P,T
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$8f,S,P,T,$a1,S+T,P,S,$8f,S+T,P,H
.byte $8f,E+T,P,S+T,$8f,E+T,P,S+T,$7a,E+T,P,S+T,$8f,E+T,P,S+T
.byte $7a,E+T,P,S+T,$7a,E+T,P,S+T,$80,E+T,P,S+T,$7a,E+T,P,S+T
.byte $8f,Q,$7a,Q,P,Q,$8f,E+T,P,S+T
.byte $8f,Q,$7a,Q,$6b,Q+E+T,P,S+T
.byte $8f,E+T,P,S+T,$5f,E+T,P,S+T,$7a,E+T,P,S+T,$8f,E+T,P,S+T
.byte $7a,T,P,S,$7a,T,P,T,$7a,S,P,T,$7a,T,P,S,$7a,T,P,T,$7a,S,P,T,$7a,T,P,S,$7a,T,P,T,$7a,S,P,T,$6b,E+T,P,S+T .byte $a1,E+T,P,S+T,$a1,E+T,P,S+T,$a1,E+T,P,S+T,$8f,E+S+T,P,T
.byte $7a,E+S+T,P,T,$6b,E+S+T,P,T,$7a,E+S+T,P,T,$a1,E+S+T,P,T
.byte $8f,V
.byte $6b,V
.byte $5f,V
.byte $50,V
.byte P,Q,$8f,E+T,P,S+T,$8f,E+T,P,S+T,$8f,E+T,P,S+T
.byte $6b,E+T,P,S+T,$6b,E+T,P,S+T,$6b,E+T,P,S+T,$6b,E+T,P,S+T
.byte $5f,E+T,P,S+T,$5f,E+T,P,S+T,$5f,E+T,P,S+T,$5f,E+T,P,S+T
.byte $8f,S+T,P,S,$8f,S+T,P,Q,$8f,H
.byte P,V
.byte ENDE

PRO_MU4 .byte K,3 .byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,E+S+T,K,2,$35,E+S+T,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,E+S+T,K,2,$35,E+S+T,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,E+S+T,K,2,$35,E+S+T,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,E+S+T,K,2,$35,E+S+T,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,E+S+T,K,2,$35,T,P,E+S+T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E+S+T,K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,2,$35,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,E+S+T,K,2,$35,T,P,E+S+T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E+S+T,K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,2,$35,S,P,T
.byte K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,S,K,2,$35,T,P,T,K,2,$35,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,2,$35,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,2,$35,S,P,T .byte K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T
.byte K,3,$32,T,P,E,K,3,$32,S,P,E,K,3,$32,S,P,S+T,K,2,$35,T,P,E+S+T,K,2,$35,T,P,E+S+T
.byte K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T
.byte K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T
.byte K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T
.byte K,3,$32,T,P,E,K,3,$32,S,P,E,K,3,$32,S,P,S+T,K,2,$35,T,P,E+S+T,K,2,$35,T,P,E+S+T
.byte K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T
.byte K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,E+S+T,K,2,$35,E+S+T,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,E+S+T,K,2,$35,E+S+T,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,E+S+T,K,2,$35,E+S+T,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,E+S+T,K,2,$35,E+S+T,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,E+S+T,K,2,$35,T,P,E+S+T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E+S+T,K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,2,$35,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,K,3,$32,T,P,E+S+T,K,2,$35,T,P,E+S+T
.byte K,3,$32,T,P,H+Q+E+S+T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E+S+T,K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,2,$35,S,P,T
.byte K,3,$32,T,P,S,K,3,$32,T,P,T,K,3,$32,S,P,T,K,2,$35,T,P,S,K,2,$35,T,P,T,K,2,$35,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,2,$35,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,2,$35,S,P,T .byte K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T
.byte K,3,$32,T,P,E,K,3,$32,S,P,E,K,3,$32,S,P,S+T,K,2,$35,T,P,E+S+T,K,2,$35,T,P,E+S+T
.byte K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T
.byte K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T
.byte K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T
.byte K,3,$32,T,P,E,K,3,$32,S,P,E,K,3,$32,S,P,S+T,K,2,$35,T,P,E+S+T,K,2,$35,T,P,E+S+T
.byte K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T
.byte K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T
.byte ENDE

;**************************************************
; HUELLKURVENTABELLEN
; Hier werden Stuetzpunkte der Huellkurven
; als Lautstaerkewerte eingetragen
; jede Tabelle beginnt mit HUELL<n>
; und endet mit 'ENDE'
;**************************************************
;
; Erster Wert ist die Verzerrung und die Lautstärke
; Der zweite Wert gibt an, was mit dem Dritten Wert
; gemacht werden soll
; $00   = Dritten Wert wird nicht berücksichtigt
; $01 = Dritter Wert überschreibt die Frequenz
; $02 = Dritter Wert wird zur Frequenz addiert
; $03 = Dritter Wert wird von der Frequenz subtrahiert 
; $04 = Dritter Wert die Schritte eines Loop zurück an
; $05 = Die Frequenz wird um 1 dauerhaft erhöht, wobei der dritte Wert eine Verzögerung angibt
; $06 = Die Frequenz wird um 1 dauerhaft reduziert, wobei der dritte Wert eine Verzögerung angibt

HUELL0 .byte $A8,$00,$00 ; Langer klarer Ton .byte ENDE

HUELL1 .byte $C6,$00,$00 ; Verzerrung für Bass-Töne .byte $C8,$00,$00 .byte $C8,$00,$00 .byte $C6,$00,$00 .byte $C6,$00,$00 .byte $C4,$00,$00 .byte $C4,$00,$00 .byte $C3,$00,$00 .byte $C3,$00,$00 .byte $00,$00,$00 .byte ENDE

HUELL3 .byte $06,$01,$03 ; Tiefer Drum .byte $A6,$01,$D0 .byte $A6,$01,$E0 .byte $A4,$01,$F0 .byte $A3,$01,$F8 .byte $02,$01,$04 .byte $01,$01,$04 .byte $00,$00,$00 .byte ENDE

HUELL2 .byte $88,$01,$00 ; Hoher Square Drum .byte $86,$01,$01 .byte $A2,$01,$02 .byte $00,$01,$00 .byte ENDE

HUELL4 .byte $A8,$05,$04 ; Klarer Ton, aber Frequenz wird ständig erhöht .byte $A8,$04,$01

  .end

Grüße Janko

Antworten

Hallo!

Die Engine entwickelt sich weiter... langsam aber stet. Ich möchte nur nicht zu viel drin haben, damit diese dennoch schlank ist. Man kann mehrere Musikstücke damit verwalten, um z.B. Intro, Spielanfang und -Ende unterschiedliche Musik nutzen zu können. Theoretisch benötigt man schon mittlerweile eine kleine Anleitung :-) Effekte etc. kann die Engine nicht, weil sie für Musik optimiert ist. Ob es Sinn macht, dies dort zu integrieren, weiß ich (noch) nicht.

Der Sound ist übrigens sehr schön. Daumen hoch!

Grüße Janko

Antworten

Ja, dass mache ich bei den Drum und bei diesem Pitch, dass ich die Hüllkurven ändere. Ohne dass, wäre alles viel zu starr.

Im Prinzip kann man:

  • Mehrere Musikstücke verwalten (immer 4 Stimmen)
  • Jederzeit die Hüllkurven ändern
  • Loops innerhalb der Noten verwenden
  • Hüllkurven mit Lautstärke und Verzerrung nutzen
  • Mit Hüllkurven die Frequenz der Noten verändern / austauschen
  • Hüllkurven per Loop verkürzen
  • Die Geschwindigkeit (sogar während des Spielens) ändern

ToDo:

  • Einfache Lautstärke-Anpassung
Antworten

Ja! Ca. 255 :-)

Ich habe Dir doch die Musik als Assemblercode zugesendet. Dort sind doch 6 Hüllkurven enthalten.

HUELL0 .byte $A8,$00,$00 ; Langer klarer Ton .byte ENDE

HUELL1 .byte $C6,$00,$00 ; Verzerrung für Bass-Töne .byte $C8,$00,$00 .byte $C8,$00,$00 .byte $C6,$00,$00 .byte $C6,$00,$00 .byte $C4,$00,$00 .byte $C4,$00,$00 .byte $C3,$00,$00 .byte $C3,$00,$00 .byte $00,$00,$00 .byte ENDE

HUELL3 .byte $06,$01,$03 ; Tiefer Drum .byte $A6,$01,$D0 .byte $A6,$01,$E0 .byte $A4,$01,$F0 .byte $A3,$01,$F8 .byte $02,$01,$04 .byte $01,$01,$04 .byte $00,$00,$00 .byte ENDE

HUELL2 .byte $88,$01,$00 ; Hoher Square Drum .byte $86,$01,$01 .byte $A2,$01,$02 .byte $00,$01,$00 .byte ENDE

HUELL4 .byte $A8,$05,$04 ; Klarer Ton, aber Frequenz wird ständig erhöht .byte $A8,$04,$01

Hmm... schaust Du Dir überhaupt an, was ich Dir sende :mrgreen:

Antworten

Hallo Peter!

288 On ch=1 n=70 v=120 352 On ch=1 n=67 v=111 352 Off ch=1 n=70 v=64 432 Off ch=1 n=67 v=64

Ich glaube, ich weiß weshalb mein Programm zwei Kanäle erzeugt hat. Wie oben zu sehen, wird Note 70 gestartet und dann Note 67 gestartet, erst dann wird Note 70 beendet. Beides im selben Tick, aber mein Programm arbeitet von oben nach unten... also wieder ein Bug gefunden. Mist.

Ich werde es heute/morgen bereinigen.

Grüße Janko

Antworten

Hallo!

Hier der neu umgesetzte Sound mit der Korrekten MIDI-Umsetzung. Jetzt sind es saubere 3 Kanäle :)

  org $2000

  icl 'Systemkonstanten.asm'

  .proc main

  jsr TitelMusik.MUSINI

?mainloop lda RTCLOK+2 ?loop cmp RTCLOK+2
beq ?loop

        jsr TitelMusik.MUSPLAY  ; Muss alle 1/50 Sekunde aufgerufen werden (z.B. im VBI)

        jmp ?mainloop

        .end

        run main

; ; ;************ ; Musik-Generator V1.5 vom 13.04.2022 ; ; ; V1.0 generelle Engine ; V1.1 vom 31.03.2022 ; Möglichkeit die Hüllkruve mit einem Loop zu versehen ; V1.2 vom 04.04.2022 ; Hüllkurven Kommandos geändert ; V1.3 vom 06.04.2022 ; Man kann nun MusikSets erzeugen und so unterschiedliche Musik abspielen ; V1.4 vom 12.04.2022 ; Man kann per MUDELAY die Musikgeschwindigkeit beeinflussen / PITCH erweitert um Kommando 5 und 6 ; V1.5 vom 13.04.2022 ; Bug im erweiterten Pitch korrigiert ;*

  .proc TitelMusik

;
;**************************************************
; Interne Variablen fuer MUSIK
;**************************************************
;

CSREGL EQU $CE ; Zeropageregister CSREGH EQU $CF

;**************************************************
; VBI-Routine, alle 1/50sec. aufgerufen
;**************************************************
;

MUSPLAY INC MUDELAY ; Musik verzögern LDA MUDELAY CMP MUMAXDELAY BNE @+ LDA #0 STA MUDELAY @ CMP #1 BNE @+ RTS

@ LDX #0 ; Kanal 0 zuerst spielen MUNXKN STX MUKANAL ; Kanal merken JSR MUXPLY ; Ton für Stimme holen JSR MUXHUL ; Huellkurve f. eine Stimme holen JSR MUPLAY ; Ton/Huellkruve spielen INX ; naechste Stimme CPX #4 ; schon alle 4 Stimmen? BNE MUNXKN ; nein --> ; RTS ; ;******* ; Initialisierungsroutine ; POKEY init., Variable loeschen, VBI setzen ;******* ; MUSINI LDA #0 ; POKEY und Variablen loeschen LDX #3 ; je 4 Register ; MUSEN1 STA AUDF1,X ; AUDF/C 1/2 STA AUDF1+4,X ; AUDF/C 3/4 STA MUDUR1,X ; Tondauer:=0 STA MUHPT1,X ; Huellk.-Zeiger:=Tabellenanfang DEX ; schon alle 4? BPL MUSEN1 ; nein, nochmal --> ; ; LDA #3 ; Pokey ruecksetzen STA SKCTL LDA #$0 ; Sound-Kontrollreg. zurueck STA AUDCTL ; LDA MUWAHL ; Welches Notenset holen? ASL ; x8 für 4 Stimmen Lo/Hi ASL ASL TAY

  LDA MUSIKSET,Y      ; Setzen der einzelnen Zeiger 
  STA STMTBL      ; der Stimmen
  LDA MUSIKSET+1,Y    ; Entspricht ein Rücksetzen
  STA STMTBH      ; der Musik

  LDA MUSIKSET+2,Y
  STA STMTBL+1
  LDA MUSIKSET+3,Y
  STA STMTBH+1

  LDA MUSIKSET+4,Y
  STA STMTBL+2
  LDA MUSIKSET+5,Y
  STA STMTBH+2

  LDA MUSIKSET+6,Y
  STA STMTBL+3
  LDA MUSIKSET+7,Y
  STA STMTBH+3  
;
  RTS
;
;**************************************************
; VBI ausschalten
; Vektor wird auf alten Wert zurueckgesetzt
;**************************************************
;

MUSAUS LDA #0 ; Sound aus! LDX #3 ; alle 4 Kanaele MUSAU1 STA AUDF1,X ; AUDF/C 1/2 STA AUDF1+4,X ; AUDF/C 3/4 DEX ; schon alle 4? BPL MUSAU1 ; nein, nochmal --> MUXPEN RTS ; ;******* ;Einen Kanal spielen ;pruefen der Tondauer, evtl. neue Note besorgen, ;Test auf ENDE, START, PAUSE ;******* ; MUXPLY LDA MUDUR1,X ; ist Kanal noch aktiv? BEQ MUXNEU ; nein, dann neue Note ; DEC MUDUR1,X ; sonst nur Tondauer - 1 BNE MUXPEN ; Ton laeuft noch ---> ; MUXNEU LDA #0 ; Flag fuer Pause vorerst STA MUPAU1,X ; zuruecknehmen STA MUHPT1,X ; Huellk. Zeiger auf Anf. LDA STMTBL,X ; Basisadresse der Noten STA CSREGL ; tabelle in Zeropage LDA STMTBH,X ; register umspeichern STA CSREGH ; LDY #0 ; Zeiger in Notentabelle LDA (CSREGL),Y ; Tonhoehe der Note ; CMP #$FA ; Kommt ein Kommando BCS MUXCMD ; Ja, dann Kommando abfragen JMP MUXWRK ; Nein, dann Note bearbeiten

MUXCMD CMP #START ; ist START-Befehl? BNE MUXN1 ; nein ---> JSR MUSINI LDX #$00
JMP MUXNEU ; MUXN1 CMP #ENDE ; ist ENDE-Befehl? BEQ MUXPAU ; ja, dann Pause imitieren --> ; CMP #LOOP ; Loop? BNE MUXN2 ; Nein, dann weiter MUXN2 JMP MULOOP ; MUXN2 CMP #HUELLKURVE ; Huellkruve wechseln?
BNE MUXWRK LDY #$01
LDA (CSREGL),Y ; gewünschte Kurve lesen STA MUHUELL,X ; und setzen JSR MUXNXT JMP MUXNEU

;

MUXWRK PHA ; Tonhoehe merken LDY #$01
LDA (CSREGL),Y ; Dauer aus Notentabelle lesen STA MUDUR1,X ; in Zaehler f. Notendauer

  JSR MUXNXT
;
  PLA       ; Tonhoehe wieder holen
  CMP #PAUSE      ; war es ein PAUSE Befehl?
  BEQ MUXPAU      ; ja ,dann Pausenbearbeitung
;
  STA STTON,X
  LDA #0
  STA MUHUDELAY,X
  RTS
;

MUXPAU LDA #PAUSE ; Huellk. ausschalten STA MUPAU1,X RTS ;
MUXNXT CLC LDA STMTBL,X ; Noten Zeiger auf ADC #$02 ; naechste Note richten STA STMTBL,X ; und abspeichern LDA STMTBH,X
ADC #$00 STA STMTBH,X
RTS

MULOOP LDY #$01
LDA (CSREGL),Y ; zweites Byte lesen BNE MULOOP1 ; = 0? Dann weiter DEC MULOOPCNT,X LDA MULOOPCNT,X BNE @+ ; Zähler ungleich 0 -> @ JSR MUXNXT ; nächste Note holen JMP MUXNEU ; und abspielen

@ LDA MULOOPADRL,X ; gemerkte Adresse STA STMTBL,X ; holen und abspielen LDA MULOOPADRH,X STA STMTBH,X
JMP MUXNEU ; Neue Adresse abspielen

MULOOP1 STA MULOOPCNT,X ; Loop-Zähler setzen JSR MUXNXT ; Adresszähler erhöhen LDA STMTBL,X ; holen und abspielen STA MULOOPADRL,X ; gemerkte Adresse LDA STMTBH,X
STA MULOOPADRH,X JMP MUXNEU ; Nächste Note holen und abspielen

;
;**************************************************
; Huellkurvengenerator
; Lautstaerke fuer einen Kanal wird gemaess
; Huellkurve eingestellt
;**************************************************
;

MUXHEN RTS

MUXHUL LDA STTON,X STA MUTEMP

  LDA MUPAU1,X      ; Flag fuer Pause?
  CMP #PAUSE      ; ist auf Pause?
  BNE MUXH0     ; nein, normale Huellk.
;
  LDA #0        ; Pause Lautstaerke auf Null
  STA STDIS,X     ; Lautst. merken
  BEQ MUXHEN      ; (immer!) an Pokey -->
;

MUXH0 LDA MUHUELL,X TAX LDA MHLTBL,X ; Huellkurven Basisadresse STA CSREGL ; in Zeropage Register LDA MHLTBH,X ; MSB STA CSREGH LDX MUKANAL LDY MUHPT1,X ; aktueller Zeiger in Hk. LDA (CSREGL),Y ; neuer Stuetzpunkt CMP #ENDE ; ist Huellk. zu Ende? BEQ MUXHEN ; ja, dann fertig! STA STDIS,X

MUDIS INY LDA (CSREGL),Y ; CMD = 0 Ton unverändert nutzen BNE MUXH1 INY JMP MUXHNX

MUXH1 CMP #$01 ; CMD = 1 Ton übernehmen BNE MUXH2 INY LDA (CSREGL),Y STA MUTEMP JMP MUXHNX

MUXH2 CMP #$02 ; CMD = 2 Ton addieren BNE MUXH3 INY CLC LDA STTON,X ADC (CSREGL),Y STA MUTEMP JMP MUXHNX

MUXH3 CMP #$03 ; CMD = 3 Ton subtrahieren BNE MUXH4 INY SEC LDA STTON,X SBC (CSREGL),Y STA MUTEMP JMP MUXHNX

MUXH4 CMP #$04 ; CMD = 4 Zeiger zurück BNE MUXH5 INY TYA SEC SBC (CSREGL),Y SBC (CSREGL),Y SBC (CSREGL),Y SBC #$02 TAY JMP MUDIS

MUXH5 CMP #$05 ; CMD = 5 Ton addieren unendlich! BNE MUXH6 INY INC MUHUDELAY,X LDA MUHUDELAY,X CMP (CSREGL),Y BNE @+ LDA #0 STA MUHUDELAY,X INC STTON,X @ JMP MUXHNX

MUXH6 CMP #$06 ; CMD = 6 Ton subtrahieren unendlich! BNE MUXH7 INY INC MUHUDELAY,X LDA MUHUDELAY,X CMP (CSREGL),Y BNE @+ LDA #0 STA MUHUDELAY,X DEC STTON,X @ JMP MUXHNX

MUXH7 INY ; Stuetzpunkt merken MUXHNX INY ; HK-Zeiger weiterschalten TYA ; und abspeichern STA MUHPT1,X

  RTS

MUPLAY TXA ; Offset fuer Pokey-Register ASL ; A Index mal 2 TAY LDA MUTEMP STA AUDF1,Y LDA STDIS,X STA AUDC1,Y ; an POKEY geben

  RTS

;
;**************************************************
;Speicherzellen einzelner Zeiger und Noten
;**************************************************
;

STTON .byte $00,$00,$00,$00 ; Speicher für Tonhöhe STDIS .byte $00,$00,$00,$00 ; Speicher für Lautstärke/Verzerrung MUDUR1 .byte $00,$00,$00,$00 ; Zaehler fuer Tondauer MUPAU1 .byte $00,$00,$00,$00 ; Flag fuer Pause MUHPT1 .byte $00,$00,$00,$00 ; Zeiger in Huellkurve MUHUELL .byte $00,$01,$02,$03 ; Zeiger auf verwendete Huellkruve MULOOPADRL .byte $00,$00,$00,$00 ; Loop-Addr LO merken MULOOPADRH .byte $00,$00,$00,$00 ; Loop-Addr HI merken MULOOPCNT .byte $00,$00,$00,$00 ; Loop-Zähler MUKANAL .byte $00 ; Aktueller Kanal MUWAHL .byte $00 ; Welches Notenset soll genutzt werden MUTEMP .byte $00 ; Temporäre Daten MUDELAY .byte $00 ; Musikverzögerung MUMAXDELAY .byte $05 ; max. Musikverzögerung (0 = aus ; je höher desto schneller) MUHUDELAY .byte $00,$00,$00,$00 ; interne Variable für die Hüllkurve

;
;***************************************************
;Definition der einzelnen Tonlängen
;Sechszehntel ist die kürzeste Länge
;***************************************************
;

PAUSE EQU $ff ; Code f. Pause P EQU PAUSE ; Kuerzel f. Pause START EQU $fe ; Code fuer Musik-Neubeginn ENDE EQU $fd ; Code fuer Stimmende HUELLKURVE EQU $fc ; Code fuer Huellkurve K EQU HUELLKURVE ; Kuerzel f. Huellkruve LOOP EQU $fb ; Code für einen Loop L EQU LOOP ; Kuerzel f. Loop ; DAUER EQU 1 ; Dauer eines 16tel ; V EQU DAUER64 ; Ganze Note H EQU DAUER32 ; Halbe Note Q EQU DAUER16 ; 4tel Note E EQU DAUER8 ; 8tel Note S EQU DAUER4 ; 16tel Note T EQU DAUER2 ; 32stel Note VS EQU DAUER ; 64stel Note

; 
;***************************************************
;Speicherstellen der einzelnen Zeiger  
;der Notentabellen
;***************************************************
;

STMTBL .byte $00, $00, $00, $00 STMTBH .byte $00, $00, $00, $00

; 
;***************************************************
;Definition der zu nutzenden Noten und Hüllkurven  
;***************************************************
;

MUSIKSET .word PRO_MU1, PRO_MU2, PRO_MU3, PRO_MU4

MHLTBL .byte HUELL0,>HUELL1,>HUELL2,>HUELL3,>HUELL4,>HUELL5,>HUELL6

;
;***************************************************
;Notentabellen:
;jede Tabelle beginnt mit Label STIMM<n>
;wobei <n>:Nummer der Stimme (1-4)
;danach folgen die Noten (Note,Dauer)
;jeweils in .byte Befehlen.
;nach letzter Note muss 'ENDE' oder
;'START' eingetragen werden.
;'START' startet die gesamte Melodie neu!
;
;Man kann mit K,1 die Hüllkurve 1 auswählen
;Mit L,8 ..... L,0 kann man die Noten 8x wiederholen
;***************************************************
;

PRO_MU1 .byte K,0 .byte P,Q,$5b,Q,$4c,Q,$44,E+T,$51,E+S+T
.byte P,T,$5b,S+T,$79,E+T,$72,S+T,$66,E+T,$5b,S+T,$72,E+T,$5b,E+S+T
.byte $5b,H+Q+E,P,V
.byte P,Q,$5b,E+T,$66,S+T,$4c,E+T,$44,S+T,$3c,E+T,$39,E+S+T
.byte P,T,$44,S+T,$51,E+T,$4c,S+T,$44,E+T,$3c,S+T,$4c,E+T,$5b,E+S+T
.byte $5b,H+Q+E,P,V
.byte P,Q,$5b,S+T,P,S,$5b,S+T,$4c,Q,$44,E+T,$51,E+S+T
.byte P,T,$5b,S+T,$79,E+T,$72,S+T,$66,E+T,$5b,S+T,$4c,E+T,$5b,E+S+T
.byte $5b,H+Q+E,P,V
.byte P,Q,$5b,E+T,$66,S+T,$4c,E+T,$44,S+T,$3c,E+T,$39,E+S+T
.byte P,T,$32,S+T,$2d,E+T,$32,S+T,$3c,E+T,$44,S+T,$4c,E+T,$5b,E+S+T
.byte $5b,H+Q+E,P,V
.byte $5b,Q,$5b,T,P,S,$5b,T,P,T,$5b,S,P,T,$b5,S+T,$99,S,$88,S+T,P,Q
.byte $66,S+T,P,S,$44,S+T,$72,S+T,P,S,$4c,S+T,$79,Q,$88,Q .byte K, 4
.byte $79,V
.byte K, 0
.byte $79,T,P,S,$79,T,P,T,$79,S,P,T,$79,T,P,S,$79,T,P,T,$79,S,P,T,$79,T,P,S,$79,T,P,T,$79,S,P,T,$79,T,P,S,$79,T,P,T,$79,S,P,T .byte $5b,Q,$4c,Q,$44,S+T,$51,S,$5b,S+T,$51,S+T,$66,S,$79,S+T
.byte $88,Q,$79,E+T,$88,S+T,$79,Q,$5b,E+S+T,P,T
.byte K, 5
.byte $79,V
.byte K, 0
.byte $79,T,P,S,$79,T,P,T,$79,S,P,T,$79,T,P,S,$79,T,P,T,$79,S,P,T,$79,T,P,S,$79,T,P,T,$79,S,P,T,$79,T,P,S,$79,T,P,T,$79,S,P,T .byte $88,S+T,$79,S,$66,S+T,$5b,H+Q
.byte $88,S+T,$79,S,$66,S+T,$5b,S+T,$44,S,$5b,S+T,$4c,H
.byte $88,S+T,$79,S,$66,S+T,$5b,Q,$51,Q,$4c,E+T,$44,S+T
.byte $5b,V
.byte $88,S+T,$79,S,$66,S+T,$5b,E+T,$66,S+T,$4c,E+T,$66,S+T,$5b,E,P,T,$66,S+T
.byte $88,S+T,$79,S,$66,S+T,$5b,S+T,$44,S,$5b,S+T,$4c,E+T,P,S+T,$44,E+T,P,S+T
.byte $88,S+T,$79,S,$66,S+T,$5b,Q,$51,S+T,$4c,S,$44,S+T,$4c,S+T,$44,S,$3c,S+T
.byte K, 6
.byte $5b,V
.byte K, 0
.byte P,Q,$5b,Q,$4c,Q,$44,E+T,$51,E+S+T
.byte P,T,$5b,S+T,$79,E+T,$72,S+T,$66,E+T,$5b,S+T,$72,E+T,$5b,E+S+T
.byte $5b,H+Q+E,P,V
.byte P,Q,$5b,E+T,$66,S+T,$4c,E+T,$44,S+T,$3c,E+T,$39,E+S+T
.byte P,T,$44,S+T,$51,E+T,$4c,S+T,$44,E+T,$3c,S+T,$4c,E+T,$5b,E+S+T
.byte $5b,H+Q+E,P,V
.byte P,Q,$5b,S+T,P,S,$5b,S+T,$4c,Q,$44,E+T,$51,E+S+T
.byte P,T,$5b,S+T,$79,E+T,$72,S+T,$66,E+T,$5b,S+T,$4c,E+T,$5b,E+S+T
.byte $5b,H+Q+E,P,V
.byte P,Q,$5b,E+T,$66,S+T,$4c,E+T,$44,S+T,$3c,E+T,$39,E+S+T
.byte P,T,$32,S+T,$2d,E+T,$32,S+T,$3c,E+T,$44,S+T,$4c,E+T,$5b,E+S+T
.byte $5b,H+Q+E,P,V
.byte $5b,S+T,P,S,$2d,S+T,$66,S+T,P,S,$32,S+T,$72,S+T,P,S,$39,S+T,$79,S+T,P,S,$3c,S+T
.byte $4c,S+T,$44,S,$4c,S+T,$5b,S+T,$51,S,$5b,S+T,$66,S+T,$5b,S,$66,S+T,$72,S+T,$79,S,$88,S+T
.byte $79,V
.byte P,V
.byte $5b,S+T,$3c,S,$2d,S+T,$66,S+T,$44,S,$32,S+T,$72,S+T,$4c,S,$39,S+T,$79,S+T,$51,S,$3c,S+T
.byte $4c,E+T,P,S+T,$5b,E+T,P,S+T,$66,E+T,P,S+T,$72,E+T,$88,S+T
.byte $79,V
.byte P,V
.byte $88,S+T,$79,S,$66,S+T,$5b,H+Q
.byte $88,S+T,$79,S,$66,S+T,$5b,S+T,$44,S,$5b,S+T,$4c,H
.byte $88,S+T,$79,S,$66,S+T,$5b,Q,$51,Q,$4c,E+T,$44,S+T
.byte $5b,V
.byte $88,S+T,$79,S,$66,S+T,$5b,E+T,$66,S+T,$4c,E+T,$66,S+T,$5b,E,P,T,$66,S+T
.byte $88,S+T,$79,S,$66,S+T,$5b,S+T,$44,S,$5b,S+T,$4c,E+T,P,S+T,$44,E+T,P,S+T
.byte $88,S+T,$79,S,$66,S+T,$5b,Q,$51,S+T,$4c,S,$44,S+T,$4c,S+T,$44,S,$3c,S+T
.byte K, 6 .byte $5b,V
.byte K, 0 .byte P,V
.byte START

PRO_MU2 .byte K,1 .byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T
.byte $8f,S+T,P,S,$80,S+T,$7a,S+T,P,S,$80,S+T,P,E+T,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$a1,S,P,T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S,P,T,$b6,T,P,S,$a1,T,P,T,$8f,S,P,T
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T
.byte $8f,S+T,P,S,$80,S+T,$7a,S+T,P,S,$6b,S+T,P,E+T,$6b,S,P,T,$6b,E,P,T,$80,S,P,T
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$8f,S,P,T,$a1,S+T,P,S,$8f,S+T,P,H
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T
.byte $8f,S+T,P,S,$80,S+T,$7a,S+T,P,S,$80,S+T,P,E+T,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$a1,S,P,T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S,P,T,$b6,T,P,S,$a1,T,P,T,$8f,S,P,T
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T
.byte $8f,S+T,P,S,$80,S+T,$7a,S+T,P,S,$6b,S+T,P,E+T,$6b,S,P,T,$6b,E,P,T,$80,S,P,T
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$8f,S,P,T,$a1,S+T,P,S,$8f,S+T,P,H
.byte $8f,Q,$8f,Q,$6b,S,P,T,$5f,S,$50,S,P,T,$7a,S,P,T,$6b,S,$5c,S,P,T
.byte $50,E+T,P,S+T,$5c,E+T,P,S+T,$5f,E+T,P,S+T,$6b,E+T,P,S+T
.byte $bf,V
.byte $bf,S,P,T,$a1,T,P,T,$80,S,P,T,$7a,E,P,T,$80,S,P,T,$7a,E+S+T,P,T,$80,E+S+T,P,T
.byte $8f,Q+E,P,E,$b6,E+T,P,S+T,$bf,E+T,P,S+T
.byte $da,E+T,P,S+T,$bf,E+T,P,S+T,$da,E+T,P,S+T,$a1,E+T,P,S+T
.byte $bf,V
.byte $bf,T,P,S,$bf,T,P,T,$bf,S,P,T,$bf,T,P,S,$bf,T,P,T,$bf,S,P,T,$bf,T,P,S,$bf,T,P,T,$bf,S,P,T,$bf,T,P,S,$bf,T,P,T,$bf,S,P,T .byte $8f,V
.byte $6b,V
.byte $5f,V
.byte $50,V
.byte $8f,E+T,P,S+T,$8f,E+T,P,S+T,$8f,E+T,P,S+T,$8f,E+T,$a1,S+T
.byte $6b,E+T,P,S+T,$6b,E+T,P,S+T,$6b,E+T,P,S+T,$6b,E+T,$7a,S+T
.byte $5f,E+T,P,S+T,$5f,E+T,P,S+T,$5f,E+T,P,S+T,$5f,E+T,$7a,S+T
.byte $8f,S+T,P,S,$8f,S+T,P,Q,$8f,H
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T
.byte $8f,S+T,P,S,$80,S+T,$7a,S+T,P,S,$80,S+T,P,E+T,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$a1,S,P,T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S,P,T,$b6,T,P,S,$a1,T,P,T,$8f,S,P,T
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T
.byte $8f,S+T,P,S,$80,S+T,$7a,S+T,P,S,$6b,S+T,P,E+T,$6b,S,P,T,$6b,E,P,T,$80,S,P,T
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$8f,S,P,T,$a1,S+T,P,S,$8f,S+T,P,H
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T
.byte $8f,S+T,P,S,$80,S+T,$7a,S+T,P,S,$80,S+T,P,E+T,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$a1,S,P,T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S,P,T,$b6,T,P,S,$a1,T,P,T,$8f,S,P,T
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T
.byte $8f,S+T,P,S,$80,S+T,$7a,S+T,P,S,$6b,S+T,P,E+T,$6b,S,P,T,$6b,E,P,T,$80,S,P,T
.byte $8f,S+T,P,S,$8f,S+T,P,E+T,$a1,S+T,$8f,S+T,P,S,$8f,S+T,P,Q
.byte $8f,S+T,P,S,$8f,S,P,T,$a1,S+T,P,S,$8f,S+T,P,H
.byte $8f,E+T,P,S+T,$8f,E+T,P,S+T,$7a,E+T,P,S+T,$8f,E+T,P,S+T
.byte $7a,E+T,P,S+T,$7a,E+T,P,S+T,$80,E+T,P,S+T,$7a,E+T,P,S+T
.byte $8f,Q,$7a,Q,$80,Q,$8f,E+T,$a1,S+T
.byte $8f,Q,$7a,Q,$6b,Q+E+T,P,S+T
.byte $8f,E+T,P,S+T,$5f,E+T,P,S+T,$7a,E+T,P,S+T,$8f,E+T,$a1,S+T
.byte $7a,T,P,S,$7a,T,P,T,$7a,S,P,T,$7a,T,P,S,$7a,T,P,T,$7a,S,P,T,$7a,T,P,S,$7a,T,P,T,$7a,S,P,T,$6b,E+T,$b6,S,P,T .byte $a1,E+T,$bf,S+T,$a1,E+T,$bf,S+T,$a1,E+T,$bf,S+T,$8f,E+S+T,P,T
.byte $7a,E+S+T,P,T,$6b,E+S+T,P,T,$7a,E+S+T,P,T,$a1,E+S+T,P,T
.byte $8f,V
.byte $6b,V
.byte $5f,V
.byte $50,V
.byte $8f,E+T,P,S+T,$8f,E+T,P,S+T,$8f,E+T,P,S+T,$8f,E+T,$a1,S+T
.byte $6b,E+T,P,S+T,$6b,E+T,P,S+T,$6b,E+T,P,S+T,$6b,E+T,$7a,S+T
.byte $5f,E+T,P,S+T,$5f,E+T,P,S+T,$5f,E+T,P,S+T,$5f,E+T,$7a,S+T
.byte $8f,S+T,P,S,$8f,S+T,P,Q,$8f,H
.byte ENDE

PRO_MU3 .byte K,3 .byte L,3, K,3,$32,T,P,E,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,S,K,3,$32,T,P,T,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T, L, 0
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,E+S+T,K,2,$35,E+S+T,P,T
.byte L,3, K,3,$32,T,P,E,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,S,K,3,$32,T,P,T,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T, L, 0
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,E+S+T,K,2,$35,E+S+T,P,T
.byte L,3, K,3,$32,T,P,E,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,S,K,3,$32,T,P,T,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T, L, 0
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,E+S+T,K,2,$35,E+S+T,P,T
.byte L,3, K,3,$32,T,P,E,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,S,K,3,$32,T,P,T,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T, L, 0
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,E+S+T,K,2,$35,E+S+T,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,E+S+T,K,2,$35,T,P,E+S+T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E+S+T,K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,2,$35,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,S,K,3,$32,T,P,T,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,E+S+T,K,2,$35,T,P,E+S+T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E+S+T,K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,2,$35,S,P,T
.byte K,3,$32,T,P,S,K,3,$32,T,P,T,$32,S,P,T,K,2,$35,T,P,S,K,2,$35,T,P,T,K,2,$35,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,2,$35,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,2,$35,S,P,T .byte K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T
.byte K,3,$32,T,P,E,$32,S,P,E,K,3,$32,S,P,S+T,K,2,$35,T,P,E+S+T,K,2,$35,T,P,E+S+T
.byte L,3, K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T, L,0
.byte K,3,$32,T,P,E,$32,S,P,E,K,3,$32,S,P,S+T,K,2,$35,T,P,E+S+T,K,2,$35,T,P,E+S+T
.byte L,2, K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T, L,0
.byte L,3, K,3,$32,T,P,E,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,S,K,3,$32,T,P,T,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T, L, 0
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,E+S+T,K,2,$35,E+S+T,P,T
.byte L,3, K,3,$32,T,P,E,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,S,K,3,$32,T,P,T,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T, L, 0
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,E+S+T,K,2,$35,E+S+T,P,T
.byte L,3, K,3,$32,T,P,E,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,S,K,3,$32,T,P,T,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T, L, 0
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,E+S+T,K,2,$35,E+S+T,P,T
.byte L,3, K,3,$32,T,P,E,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,S,K,3,$32,T,P,T,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T, L, 0
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,E+S+T,K,2,$35,E+S+T,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,E+S+T,K,2,$35,T,P,E+S+T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E+S+T,K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,2,$35,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,S,K,3,$32,T,P,T,$32,S,P,T,K,2,$35,T,P,E,K,3,$32,S,P,T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,3,$32,S,P,T,$32,T,P,E+S+T,K,2,$35,T,P,E+S+T
.byte K,3,$32,T,P,H+Q+E+S+T
.byte K,3,$32,T,P,E+S+T,K,2,$35,T,P,E+S+T,K,3,$32,T,P,E+S+T,K,2,$35,T,P,E,K,2,$35,S,P,T
.byte K,3,$32,T,P,S,K,3,$32,T,P,T,$32,S,P,T,K,2,$35,T,P,S,K,2,$35,T,P,T,K,2,$35,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,2,$35,S,P,T,K,3,$32,T,P,S,K,3,$32,T,P,T,K,2,$35,S,P,T .byte K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T
.byte K,3,$32,T,P,E,$32,S,P,E,K,3,$32,S,P,S+T,K,2,$35,T,P,E+S+T,K,2,$35,T,P,E+S+T
.byte L,3, K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T, L,0
.byte K,3,$32,T,P,E,$32,S,P,E,K,3,$32,S,P,S+T,K,2,$35,T,P,E+S+T,K,2,$35,T,P,E+S+T
.byte L,2, K,3,$32,T,P,Q+E,K,3,$32,S,P,T,K,2,$35,T,P,Q+E+S+T, L,0 .byte ENDE

PRO_MU4 .byte K,0 .byte ENDE

;**************************************************
; HUELLKURVENTABELLEN
; Hier werden Stuetzpunkte der Huellkurven
; als Lautstaerkewerte eingetragen
; jede Tabelle beginnt mit HUELL<n>
; und endet mit 'ENDE'
;**************************************************
;
; Erster Wert ist die Verzerrung und die Lautstärke
; Der zweite Wert gibt an, was mit dem Dritten Wert
; gemacht werden soll
; $00   = Dritten Wert wird nicht berücksichtigt
; $01 = Dritter Wert überschreibt die Frequenz
; $02 = Dritter Wert wird zur Frequenz addiert
; $03 = Dritter Wert wird von der Frequenz subtrahiert 
; $04 = Dritter Wert die Schritte eines Loop zurück an
; $05 = Die Frequenz wird um 1 dauerhaft erhöht, wobei der dritte Wert eine Verzögerung angibt
; $06 = Die Frequenz wird um 1 dauerhaft reduziert, wobei der dritte Wert eine Verzögerung angibt

HUELL0 .byte $A8,$00,$00 ; Langer klarer Ton .byte ENDE

HUELL1 .byte $C6,$00,$00 ; Verzerrung für Bass-Töne .byte $C8,$00,$00 .byte $C8,$00,$00 .byte $C6,$00,$00 .byte $C6,$00,$00 .byte $C4,$00,$00 .byte $C4,$00,$00 .byte $C3,$00,$00 .byte $C3,$00,$00 .byte $00,$00,$00 .byte ENDE

HUELL3 .byte $06,$01,$03 ; Tiefer Drum .byte $A6,$01,$D0 .byte $A6,$01,$E0 .byte $A4,$01,$F0 .byte $A3,$01,$F8 .byte $02,$01,$04 .byte $01,$01,$04 .byte $00,$00,$00 .byte ENDE

HUELL2 .byte $88,$01,$00 ; Hoher Square Drum .byte $86,$01,$01 .byte $A2,$01,$02 .byte $00,$01,$00 .byte ENDE

HUELL4 .byte $A8,$05,$05 ; Klarer Ton, aber Frequenz wird ständig erhöht .byte $A8,$04,$01

HUELL5 .byte $A8,$06,$07 ; Klarer Ton, aber Frequenz wird ständig niedriger .byte $A8,$04,$01

HUELL6 .byte $A8,$00,$00 ; Klarer Ton, aber Frequenz wird nach etwas Zeit ständig erhöht .byte $A8,$00,$00 .byte $A8,$00,$00 .byte $A8,$00,$00 .byte $A8,$00,$00 .byte $A8,$00,$00 .byte $A8,$00,$00 .byte $A8,$00,$00 .byte $A8,$00,$00 .byte $A8,$05,$04 .byte $A8,$04,$01

  .end

Bei den Drums konnte ich ein paar Loops nutzen, um die Daten zu reduzieren. Einen Bug im erweiterten Pitch? habe auch noch korrigiert. Nun sind es 7 Hüllkurven, die genutzt werden (0-6). Ich hoffe der Sound ist jetzt annährend so, wie gewünscht.

Zu Deiner Frage wg. Pitch von unten auf normal und ggf. oben auf normal: Das Problem ist, dass der Anfang dieser Kurve je nach Notenlänge immer anders wäre. Ich müsste hier also immer den Anfang oder die Steigung berechnen. Dass würde die Engine zu sehr aufblähen und den VBI belasten. Du kannst aber eine manuelle Hüllkurve mit Kommando 2 oder 3 nutzen:

  .byte $A8,$03,$0A   ; 10 Stellen niedriger in der Frq. beginnen
  .byte $A8,$03,$0A
  .byte $A8,$03,$09
  .byte $A8,$03,$09
  .byte $A8,$03,$08
  .byte $A8,$03,$08
  .byte $A8,$03,$07
  .byte $A8,$03,$07
  .byte $A8,$03,$06
  .byte $A8,$03,$06
  .byte $A8,$03,$05
  .byte $A8,$03,$05
  .byte $A8,$03,$04
  .byte $A8,$03,$04
  .byte $A8,$03,$03
  .byte $A8,$03,$03
  .byte $A8,$03,$02
  .byte $A8,$03,$02
  .byte $A8,$03,$01
  .byte $A8,$03,$01
  .byte $A8,$03,$00   ; Normale Frq. erreicht
  .ENDE

Grüße Janko

Antworten

... jetzt habe ich mal folgendes gemacht:

Beide Stücke sind in der Engine drin, das neue Stück wird beim Intro gespielt (läuft etwas schneller) - das läuft solange, bis man auf Start drückt. Dann verändere ich die Geschwindigkeit und den Musikset und er spielt dann die alte Musik in richtiger Geschwindigkeit weiter....

intro mwa #dlist1 560 mva #0 TitelMusik.MUWAHL jsr TitelMusik.MUSINI @ lda RTCLOK+2 mloop cmp RTCLOK+2
beq mloop mva #6 TitelMusik.MUMAXDELAY jsr TitelMusik.MUSPLAY
sec lda consol sbc #7 bpl @- mva #1 TitelMusik.MUWAHL jsr TitelMusik.MUSINI mva #3 TitelMusik.MUMAXDELAY

Das funktioniert!! Gruß Peter

Antworten

Hi!

Habe leider eine Zahnwurzelentzündung und absolut nicht zu gebrauchen. Das lange Osternwochenende verzögert die für mich so sehnsüchtige Behandlung. Jetzt muss ich hoffen, dass Penizillin und Schmerztabletten es irgendwie meistern, aber momentan sieht es nicht danach aus. Drück mir die Daumen, die Zahnärztin meinte, dass ich eigentlich Schmerzfrei werden sollte, durch das Penizillin.

Das Spiel kommt voran... aber die Osterzeit kann ich wohl nicht nutzen.

Grüße Janko

Antworten

Moin!

Ist ja bald Ostern... statt der Ostereiersuche machst Du halt eine Fehlersuche :-) Bei mir sind auch noch Bugs enthalten, wo ich einfach nicht den Ursprung finde. Hin- und wieder werden Sounds nicht abgespielt, obwohl der Rest läuft... Ich habe noch sehr viel zu tun... werde Dir heute vllt. noch ein Video senden, wo man den Fortschritt sehen kann. Schick mir auch mal Dein Intro, bin neugierig.

Grüße Janko

Antworten

Wenn es geht ruhig als Video, wobei ich bei Altirra momentan nur verzerrte Videos raus bekomme :-(

Ach ja, ich möchte Dich schon mal fragen, ob Du bereit wärst mein Spiel zu testen, wenn es fertig ist. Man ist ja selbst so in Thema, dass man manche Sache gar nicht sieht.

Janko

Antworten

Klar teste ich gerne Dein Spiel. :-) Spielidee... ja dass ist sicherlich eine Sache. Aber Umsetzung die andere. Ich habe Angst, dass mein Spiel zu eintönig/leicht ist. Aber das kann ich erst zum Schluss optimieren, erst einmal muss ja das Grundsätzliche laufen. Animation etc. pp. fehlt auch noch... naja.

Der Altirra bietet eine Record-Funktion, aber wie gesagt, bekomme ich da immer eher ein 16:9 Bild raus, statt das geforderte 4:3.

Antworten

Okay, für jemand wie mich, der Englisch nicht aus dem FF kann, ist die Laufschrift ein wenig schnell. Aber ansonsten schön flüssig. Ich würde versuchen den Namen "Return to Phobos" dauerhaft über der Laufschrift einzublenden. Nimm einfach Gr. 2. Richtig genial sind die beiden Sounds. Gut ausgewählt während des Spiels den Sound von Matthias zu nehmen und im Intro den anderen. Daumen hoch! (so ein Daumensmilie fehlt hier irgendwie :mrgreen: )

Antworten

unten im Intro würde ich noch die beiden Komponisten erwähnen und auch dich für die Sound Engine… ist das ok für dich?

Antworten

Würde mich natürlich freuen, wenn Du mich erwähnst, aber musst Du nicht. Wir helfen uns ja gegenseitig.

Antworten

Habe Deine E-Mail erhalten. Danke erst einmal fürs Lob. Leider wird mein "Spieler" nur grob springen und kein Sprite werden. Das liegt an unterschiedlichen Sachen, u.a. nutze ich bereits alle Sprites. Ausserdem wäre die Auflösung und die Anzahl der Farben dann geringer usw. Ist mehr so Style BoulderDash. Nur muss die Figur halt noch Animiert werden (Laufbewegung). Hier hat Dein Spiel klar einen Vorteil, aber so unterscheiden sich die Spiele :-) Die gesamte Kollisionskontrolle ist nun auf dieses Schema ausgelegt, weshalb ich es auch nicht einfach ändern könnte.

Janko

Antworten

Hallo!

Heisst das Spiel "Return to Phobos 2022" ? Dachte nur "Return to Phobos". Sieht doch gut aus.

Ich habe Dir übrigens eine E-Mail gesendet, mit meinem neusten Programmierstand.

Grüße Janko

Antworten

... Hi Janko, du hast Recht.Es soll nur Return to Phobos heißen!

Die Laufanimation sieht richtig gut aus, damit wirkt es auch viel flüssiger... da brauchst du gar kein Feinscrolling beim Laufen. Mir gefällt die Musik und die Soundeffekte... hast du das auch jetzt über die Engine gemacht?

Im Grunde hast du ein schönes Intro, eine gute Levelgrafik, Sounds + Musik.... du bist weit! Du mußt jetzt "nur" noch Level generieren... Das wird ein wirklich schönes Spiel!!! Gfruß Peter

P.s. was. macht dein Zahn?

Antworten

Hallo Peter!

Wünsche Dir eine schöne Osterzeit und hoffentlich keinerlei Bereitschaftsdienst.

Ich war heute beim zahnärztlichen Notdienst, die haben mir eine höhere Ibuprofen-Dosis (unter der Hand) empfohlen. Ich bin leider stark übergewichtig, weshalb die Normaldosis nicht bei meinen Schmerzen ausreicht. Bis Dienstag ist nicht mehr lang und ich werde mich irgendwie durchschlagen. Wieder ein Grund mehr abzunehmen, aber Gründe habe ich genug... nur klappt es leider nicht. :roll:

Bei meinen Spiel sind noch eine Menge Bugs, bzw. Situationen, die ich anderes gelöst haben möchte. Auch kann meine Figur noch nicht schießen. Aber hey, Bis Ende Juli wird es sicherlich werden... uns 2023 gibt es auch noch :lol:

Der Quellcode ist aber gruselig und muss beim nächsten Projekt besser werden. Aber man lernt ja mit jeder Zeile, die man schreibt.

Grüße Janko

Antworten

Hallo Janko, auch ich wünsche Dir eine frohe Osterzeit. Bereitschaft hatte ich gestern den ganzen Tag und es war auch viel los... aber heute und morgen frei! Die Ibu solltest du tatsächlich dem Gewicht angepasst dosieren. Wegen der Halbwertszeit von 4-6 Stunden würde ich auch tatsächlich mid. alle 6 Stunden eine Ibu nehmen, da du sonst an bestimmten Zeiten keine volle Wirkung mehr hast. Du kannst also z.B. alle 6 Stunden eine Ibu 600 nehmen - dann hättest du eine Gesamtdosis von 2400 mg - bei unter 100 kg würde ich die Dosis vielleicht etwas reduzieren, bei über 100 kg könnte man theoretisch wohl noch etwas höher gehen, das würde ich aber nicht machen. Die arme Leber muss das ja alles vertragen. Das sollte dann bis Dienstag gehen. Dein Programm wird richtig gut, denke ich. Optisch sieht es schon toll aus, der Sound passt super - nun fehlen noch ein paar Level und vielleicht ein paar Extras. Bei Spelunker oder auch bei Shamus kommen irgendwann so Geister, die einen töten können - vielleicht so etwas, um den Schwerefaktor noch zu erhöhen. Vielleicht baust du auch in hinteren Level. noch eine Sprungoption mit ein... kA - mach weiter... wird gut. Ich habe heute mal geschaut was ich noch an Speicher habe... 4-6 kB, mehr nicht. Ist aber reiner Code und das sollte reichen. Gestern und Vorgestern habe ich aber wenig programmiert, dafür mehr Ikea ab-/ und aufgebaut, heute gehts zu Freunden, morgen vielleicht ein wenig coden... Ich wünsche dir was und komm einigermaßen gut durch! Gruß Peter

Antworten

Hallo Janko, vielen Dank erstmal für das Programm und den Betatest... natürlich bleibt das Programm hier bei mir!! Beim Test sind mir mehrere Sachen aufgefallen: Wenn der Player laufen soll, muss man jedesmal den Joystick quasi neu anstossen. Schöner wäre es, wenn man nach rechts drückt und rechts hält und der Spieler dann ständig weiterläuft (bis zu einer Begrenzung). Eine Tür muss man mehrmals "anstupsen", dann geht sie auf und man kann das Gold schürfen... ich würde dann auch den Player auf das Gold gehen lassen (also auf das Feld mit dem Gold). Die Energiebarriere ist cool, aber ab und zu kommt man durch und einmal ist das Programm hängengeblieben... hier ist noch ein Bug drin. Die Schranke würde ich auch noch besser einsetzen, weil sie echt cool ist... der Spieler sollte bei der Berührung sterben (die Geister können natürlich durch) und vielleicht muss man auch mal durch Schranken durch, um an Gold zu kommen. Die Pistole ist cool, aber wenn man damit einen Geist trifft, ist er einfach weg... hier würde ich irgendeine Sterbeanimation noch einfügen. Die Geister sind auch noch zu lieb, man kann direkt neben denen stehen und es passiert nicht gleich was - manchmal hauen die auch ab... ;-) da muss noch KI rein. Man sieht nicht, wieviele Player man hat. Das Spiel ist schon recht gut und ich bin auf weitere Betalevel gespannt... LG Peter

P.s. was macht der Zahn?

Antworten

Das mit dem Designfehler kenne ich... da habe ich auch einige drin und müsste das Spiel in großen Teilen umschreiben... aber das mache ich nicht. Es läuft so wie es läuft, ich mache am Wettbewerb mit und der Platz ist mir egal..., da programmieren Leute schon seit Jahren und kennen die Tücken... Mein nächstes Projekt soll etwas strukturierter sein. Ich habe es am Atari800MacX Emulator gespielt und es lieft einwandfrei. Ich teste das aber auch an original Hardware! Gruß Peter

Antworten

Das sieht schon sehr gut aus... ich teste es wieder gerne. Wieviele Level hast du denn geplant?

Ich habe mich heute nochmal grundlegend mit der Explosion der Items beschäftigt und festgestellt, daß meine jetzige ursprüngliche Routine am besten funktioniert. Ich lasse das so. Wenn ich fertig bin mit dem Spiel und alles läuft, dann werde ich vielleicht noch ein paar Sonderfälle abfragen und entsprechend bearbeiten. Ansonsten habe ich heute die Schiffskollision + Explosion implementiert und den Sound für die Explosionen und den Schuss begonnen. Wenn das alles fertig ist mache ich die Landschaft incl. Endgegner fertig....
Sobald das Game spielbar ist, bekommst du es zum Test! Ich rechne noch mit ca. 4 Wochen... Gruß Peter

Antworten

Hi Janko, gestern und heute habe ich ein paar Stunden an meinem Programm gearbeitet und nun habe ich erstmalig eine komplett durchlaufende in sich abgeschlossene Programmeinheit. Das Intro ist fertig, Schusssound und Sound für die Schiffsexplosion ist drin. Die Anzahl der Schiffe wird jetzt mit 5 festgelegt und bei der Schiffsexplosion runtergezählt, die Schiffe werden entsprechend auch weniger angezeigt. Das Spiel läuft nach kurzer Pause weiter bis es keine Schiffe mehr gibt, dann wird das System komplett reinitialisiert mit Neustart des Intros incl. Musik etc. - theoretisch könnte man jetzt das Spiel durchspielen bis man keine "Leben" mehr hat und dann neu starten. Es gibt aber noch etliche Bugs! Das Raumschiff muss nach Kollision neu an eine sichere Stelle gesetzt werden - und neu richtig gezeichnet werden. Jetzt sind hier noch Fehler drin und man zerstört sich evt. ständig selbst. Die Explosion der Items muss noch gesetzt werden. Die Explosionen im nicht scrollenden Part dürfen nicht weiterlaufen. Die Miniraumschiffe des Sonderlevels werden noch nicht gut erkannt... hier kommt man kaum durch. Das Endlevel muss noch generiert werden, hier überlege ich, ob ich noch einen Player als Feind generiere, der gegen das eigene Raumschiff schiessen kann ) ich habe noch 3 Missiles und einen Player übrig. Die Raumschiffexplosion muss noch etwas überarbeitet werden. Vielleicht (wenn dann noch Platz ist) kommt noch Extrasound beim Sonderlevel rein... Dann teste ich die Landschaft vor und dann bekommst du die erste Betaversion zum Testen! Noch viel Arbeit, aber es wird... Gruß Peter

Antworten

Hi Janko, ich habe dir mal meine erste Vor-Beta-Version geschickt... Erste Version, die zumindest mal spielbar ist und läuft... mit vielen Bugs... ;-) Gruß Peter

Antworten

... ich finde übrigens unseren Austausch hier sehr spannend und erquicklich ... falls du Interesse an einem etwas direkteren Kontakt hast (z.B. WA), dann hier meine Nummer: 01712827936 - falls nicht, dann einfach löschen. Gruß Peter

Antworten

... ich finde auch, daß es recht schwierig ist und eigentlich auch nur mit Joystick gut zu spielen ist. Die Schwierigkeiten werden hinten noch viel intensiver... da werde ich aber noch ein paar Anpassungen machen, so daß man etwas besser durchkommen kann... man soll das Spiel aber ja auch nicht in 5 Minuten durch haben ;-)

Antworten

Hallo Peter!

Etwas worüber ich mir überhaupt keine Gedanken gemacht habe ist, dass mein Spiel evtl. zu groß werden könnte. Da mein Spiel min. 10 Level haben soll, habe ich Dummy-Level erstellt, um diese dann mit Leben füllen zu können. Als ich dann mein Spiel starten wollte, kam der Hinweis, dass nicht genug Speicherplatz vorhanden ist. :shock: Ich habe eine Routine programmiert, die den Speicherplatz prüft und entsprechend warnt.

Also habe ich überflüssiges gelöscht und ein wenig optimiert und leider immer noch >$A000 an Speicher gebraucht. Dann fiel mir endlich auf, dass $A000 das BASIC ist :roll: Also Basic abgeschaltet und alles ging wieder. Manno, wie blöd man manchmal ist :D

Grüße Janko

Antworten

Hallo Janko, das Speicherproblem beobachte ich bei mir schon seit Wochen, da klar ist, daß ich auch nur eine bestimmte Menge an Scrollzeit zur Verfügung habe. Daher habe ich ja auch das mit der letzten Reihe von Anfang an so konzipiert, daß ich statt 40 Bits pro Reihe nur 13 brauche - und das dann umständlich zusammenbaue. Irgendwann musste ich ebenfalls das Basic ausschalten und mittlerweile brauche ich auch ein sehr schmales ROM, da mein Spiel schon bei 4096 startet. Mein Bildschirm fängt bei 41000 an, der 2. Bildschirm dann bei 42500 und darüber kommt dann die ganze PM Grafik. Im Grunde habe ich also nur Platz zwischen 4096 und 41000.. aktuell stehe ich bei 36441!!! Ich habe also noch 4500 Bytes für Code zur Verfügung. Die werde ich auch noch komplett brauchen!! Mein Emulator zeigt das auch sofort perfekt an... macht das Altirra nicht?? Gruß Peter

Antworten

.... ich könnte, wenn es ganz knapp wird auch noch etwas früher starten, nämlich bei $400 (1024). Dann bekomme ich nochmal 3k für Code, ein DOS gibt es dann aber nicht mehr, das Spiel müsste dann direkt von Diskette starten... geht aber! Von welcher Adresse startest du dein Spiel??

Antworten

Prodehl schrieb: Mein Emulator zeigt das auch sofort perfekt an... macht das Altirra nicht??

Ich muss gestehen, dass ich nicht weiß, wo man es sehen könnte. Bin jetzt wieder unterhalb von $A000 mit meinem Speicherverbrauch. Ziel ist es unterhalb zu bleiben, damit ein ATARI 800 mit 48kb auch das Spiel ausführen kann.

Grüße Janko

Antworten

... genau, das plane ich auch so. Der Emulator auf 48k eingestellt spielt noch das Spiel fehlerfrei ab.... wird aber langsam eng ;-)

Antworten

Stimmt... 48kb endet bei $C000 und nicht bei $A000 :oops: Okay, scheint nicht mein Tag zu sein ;)

Antworten

ja, aber ab ca. 40000 fängt ja sicherlich dein Bildschirm an und die Player kommen danach... dann noch ROM. Im Grunde kannst du bei einem Atari mit einem Speicher von ca. 1000 bis 41000 - also ca. 40kB für dein Programm...

Antworten

... übrigens finde ich 4kB für die Player/Missile recht viel und in der Regel völlig überdimensioniert. Ich werde vielleicht für mein nächstes Projekt überlegen, ob ich alles rein pixelbasiert mache... die ganze Kollisionsabfrage finde ich höchst unzufrieden stellend und schlecht kontrollierbar...

Antworten

Ich muss zugeben, dass ich den Bildschirmspeicher und die Player im Bereich $2000-$4000 ablege. Wenn man BASIC nutzt, geht natürlich nur RAMTOP, aber ansonsten ist man da relativ frei.

Antworten

am Ende ist es natürlich egal wo... oder hast du da unten für den Bildschirm und die PM bessere Erfahrungen gemacht??

Antworten

Nein, war für mich nur einfacher im Handling, dass ich zu Beginn meines Programmes den Bildschirmspeicher, die Zeichensätze etc. pp. definiere. Da muss man ja sich an die Ausrichtung an die Pages halten. Dannach kommt Fließtext :-)

Antworten

... da würde mich echt mal interessieren, wie du den Anfang aufgebaut hast. Meiner sieht so aus:

Bildschirmfoto 2022-04-22 um 16.31.23.png

Antworten

Ich habe ja noch einen "Loader" enthalten, der den verfügbaren Speicher prüft und ggf. direkt den Ladevorgang abbricht. Hier ein Ausschnitt meines Anfang:

;###################################################################################### ;## Speicherbereiche definieren ;##

PMADDR equ $2000

SPScrMem01 equ $3000 SPScrMem02 equ $3028 SPScrMem03 equ $3050 SPScrMem04 equ $3078 SPScrMem05 equ $30A0 SPScrMem06 equ $30C8 SPScrMem07 equ $30F0 SPScrMem08 equ $3118 SPScrMem09 equ $3140 SPScrMem10 equ $3168 SPScrMem11 equ $3190 SPScrMem12 equ $31B8 SPScrMem13 equ $31E0 SPScrMem14 equ $3208 SPScrMem15 equ $3230 SPScrMem16 equ $33E8 SPScrMem17 equ $3410 SPScrMem18 equ $3438

SPScrMem equ SPScrMem01 SPLevelY0 equ SPScrMem02 SPLevelY1 equ SPScrMem06 SPLevelY2 equ SPScrMem10 SPLevelY3 equ SPScrMem14

SPStatusScr equ $3460 SPLootScr equ $3474 LoadMem equ $3F00 GameMem equ $4000

;###################################################################################### ;## Programm wird beim Ladevorgang ausgeführt ;## ORG LoadMem

  .proc LOADER

  lda #>MaxAddr+1
        cmp RAMTOP
        bcc RamOK

        ; Ram ist zu klein für das Spiel, deshalb BASIC aus

... ... ... ...

  .end
        INI LOADER ;Make sure the loader is executed before the main program is loaded

;###################################################################################### ;## Unterprogramme laden ;## org GameMem

  icl 'Systemkonstanten.asm'
  icl 'Schraenker-Daten.asm'  
  icl 'Schraenker-Musik.asm'  
  icl 'Schraenker-Titeldaten.asm' 
  icl 'Schraenker-Spieldaten.asm'
  icl 'Schraenker-Titelscreen.asm'  
  icl 'Schraenker-Spiel.asm'
  icl 'SFXEngine.asm'

sRAMTOP .byte $00 sCHBAS .byte $00

;###################################################################################### ;## Routine um den GTIA-Chip zu identifizieren und die Bildschirmfrequenz ;## .proc getGTIA

@ lda VCOUNT ; Anzahl der VCounts zählen ... ... ...

Antworten

puhhh ... shit... das sieht viel strukturierter aus, als bei mir ;-) spannend... mal noch eine andere programmiertechnische Frage, die mir schon bei deiner Engine aufgefallen ist: Die Anweisungen sRAMTOP .byte $00 sCHBAS .byte $00

verstehe ich nicht ganz... sind .byte $00 quasi Platzhalter für die Daten, die später an sCHBA kommen?

Antworten

Richtig, dass ist eine Art Variable, wo ich während der Ausführung Daten abspeichere.

Antworten

und wohin - also an welche Speicherstelle - legt er die Daten ab? Da wo er sCHBAs im Speicher stehen hat? In diesem Fall gibt es auch nur eine 8-bit Variable?! Ich sehe gerade, du nutzt noch die SFXEngine.... für die Soundeffekte??

Antworten

Wenn ich sRAMTOP .byte $00 sCHBAS .byte $00

setze, dann ist das eine 8-Bit Variable, die an er Stelle steht, wo der Compiler diesen Bereich vorsieht. Man kann dies in der ".lst"-Datei nachsehen:

178
 179 9C4E 00      sRAMTOP   .byte $00
 180 9C4F 00      sCHBAS    .byte $00
 181

Der Compiler hat also für sRAMTOP die Speicherzelle 9C4E vorgesehen.

Antworten

Ne, da gibt es zwei Variante:

VarA .byte $00, $00 VarB .word $0000

Du kannst also entweder 2 Bytes hintereinander definieren, oder was optisch besser ist, ein Word definiere. Ein Word ist 16 Bit groß.

Antworten

... ja klar .byte $00, $00 logisch und ja schon x-fach verwendet als Daten... ist ja letztlich nix anderes! Du definierst irgendeinen Bereich im Computer als z.B. VarA oder sCHBAS - der Rechner reserviert sich eine oder mehrere Speicherstellen im Ram und dort schreibt man dann die Daten rein. Ist dann halt ne Definition des Assemblers, wie ich was schreiben kann... ich habe das bislang nur für fixe Daten genutzt - stimmt natürlich auch nicht so ganz, denn wenn man einen bestimmten Charakter animiert, dann verändert man ja diesen Speicherbereich...

Antworten

Hallo und guten Morgen Janko, wie hast du eigentlich das atr erzeugt? WUDSN schmeißt ja nur xex aus. Wie gehts deinem Zahn und was machen die Level? Gruß Peter

Antworten

Hallo!

Man kann mit dem Altirra ganze Verzeichnisse als Diskette mounten (R/O) und dann die XEX auf eine als ATR gemountete Diskette kopieren. Geht recht einfach mit dem Altirra.

Ich habe nun 5 Level erstellt... bei den beschränkten Möglichkeiten tue ich mich etwas schwer, verschiedene (interessante) Level zu erstellen. Nebenbei habe ich einprogrammiert, dass man auch wirklich nach beenden eines Levels ins nächste kommt. :-) Ein paar Bugs mussten auch noch dran glauben... so das Übliche halt.

Mein Zahn wurde Dienstag gezogen und da ich nun ohne Brücke/ohne Zahn bin, habe ich echt Probleme beim Essen. Naja, habe genug auf den Rippen... stört nicht. Nächsten Monat muss ich mich dann um Ersatz kümmern, wenn meine Wunde im Mund 100% okay ist.

Nebenbei ärgere ich mich ein wenig übers Forum, wie Du sicherlich mitbekommen hast. Die Leute verstehen absichtlich falsch und treten gerne nach. Mehr als Entschuldigen (obwohl ich keinen angegriffen habe), kann ich mich nicht. Die Aussage von PPS war dermaßen überzogen, dass ich mich schon frage, in wie Weit das Forum wirklich interessant für mich ist und in wie Weit ich am Software-Wettbewerb überhaupt teilnehmen möchte. Muss ich erst einmal sacken lassen. Ist ja noch Zeit bis zum 31.07. und bis dahin fließt noch viel Wasser den Rhein runter. ;)

Grüße Janko

Antworten

Hi Janko, ich habe die Diskussion im Forum gar nicht mitbekommen.... wo war das denn? Bin mal gespannt auf deine weiteren Level.... Ich schicke dir heute mal eine weitere Version... wenn du das Raumschiff auf den oberen Rand steuerst, kommst du weiter... ich habe das zum testen so gemacht. Man kann jetzt das Programm auch mit Feuer bzw. Klick starten. Grüße Peter

Antworten

Okay, bin gespannt auf die neue Version. Freu mich.

Bitte schau Dir den Thread nicht an.. nachher magst mich auch nicht mehr :shock:

Grüße Janko

Antworten

Janko, hab es gerade gefunden und kommentiert. Du hast deine Meinung gesagt und das ist gut. Das Forum sollte deutsch bleiben, mal was auf englisch finde ich jetzt persönlich nicht schlimm, aber das sollte nicht einreißen... da stimme ich dir zu. Du musst da jetzt auf das Thema aber auch nicht weiter eingehen... manchmal ist es dann besser, einfach sich aus so einer Diskussion dann rauszunehmen und einen Schritt zurückzumachen - und das hast du ja auch. Und keine Sorge, ich selber bin extrem tiefenentspannt und mag dich natürlich weiterhin. Finde unseren Kontakt hier sehr positiv!! Liebe Grüße Peter

p.s. wie alt bist du eigentlich? Ich bin schon 57 ;-)

Antworten

Hi!

Wau, irre wie sich Dein Spiel entwickelt hat. Die Landschaft finde ich echt gut. Manchmal sind noch ein paar Fehler drin, aber insgesamt ist die echt gelungen. Die Zwischensequenz mit den Raumschiffen hat mich total überrascht. Du hast da ja noch eine weitere Musik! Passt super! Ich habe natürlich immer noch Probleme mit dem linken und rechten Schuss... aber das liegt halt an meiner Unfähigkeit :-) Aber es ist wirklich jetzt etwas einfacher, so dass auch ich mich freuen kann, wenn es wieder etwas weiter geht. Echter Joystick... ja, ich muss auch mein Spiel mal auf echter Hardware spielen... mal schauen, wie ich es machen kann.

Auf jedem Fall Top! Janko

Antworten

Oh vielen Dank!!! Ist aber noch einiges zu tun... die Schusserkennung muss ich noch optimieren - aber das mache ich ganz am Ende. Das mit der Musik war so eine Eingebung - der Engländer hat mir eine kurze Sequenz am Anfang unseres Kontaktes zum probieren gegeben und die fand ich ganz passend für diese Kurzen Extralevel... Grüße Peter

Antworten

… bin gerade ein paar Tage im Urlaub in der Türkei… melde mich später!

Antworten

Hallo Janko, bin gestern Nacht aus der Türkei zurück und muss mich erstmal erholen... in den nächsten 3 Wochen will ich dann auch das Spiel so fertig haben, daß man nur noch kleine Fehlerkorrekturen machen muss... Bin echt gespannt auf dein Spiel und die weiteren Level!! Grüße Peter

Antworten

nöö - wir machen da immer so ein Tennis-Camp mit 4h Tennis pro Tag in brütender Hitze. Jetzt kann ich kaum noch laufen und der Flug kam erst in der Nacht um 2 wieder zurück... aber egal. War schön ;-) Schränker ... testen .... jederzeit gerne!

Grüße Peter

Antworten

Guten Morgen Janko, klar bin ich damit einverstanden, musst du aber nicht... fühle mich aber geehrt bei so einem tollen Spiel!! Grüße Peter

Antworten

... ich habe noch ein wenig zu tun mit RtP ... bin aber gestern echt voran gekommen!! Hast du dir es mal angeschaut?

Antworten

Ha ... gerade erst deine e-Mail gelesen!

Deine Tests und die kritische Auseinandersetzung damit ist mir echt wichtig... Zu den einzelnen Punkten: Das mit dem Intro sehe ich so zum ersten Mal! Hast du das Programm auf dem Altirra getestet oder direkt am Atari?

Die große Kurve ist echt fies, ich weiß - selber geschafft habe ich sie schon, aber vielleicht muss ich das etwas entschärfen!

Das mit den Fallen stellen stimmt, es gibt insgesamt 2 Fallen. Der Öltank hängt in der Luft, das ist blöd und das änder ich noch! Guter Hinweis!

Ja, man stirbt auch bei der Kollision mit der Explosionswolke... wenn ich ganz am Ende fertig bin, versuche ich das noch zu fixen, aber das wird mal wieder tricky und ich habe fast keinen freien Speicher mehr...
Vielen Dank für die Inputs!! Grüße Peter

Antworten

... habe dir mal ein schnelles BugFix gesendet... hoffe das Intro ist jetzt sauber!

Ich werde das Programm auf jeden Fall auf echter Hardware final testen (auf der NOMAM lief es stabil auf meinem Atari 130 XE!).

Antworten

Hurraaaa! Zum Glück habe ich frühzeitig fast alles in Subroutinen programmiert... und eine Subroutine ist Bildschirmleeren... ein einfacher JSR hat dann ausgereicht!

Antworten

soooo... ich gebe jetzt Gas und möchte auch bald fertig werden! Landschaft ist fertig, der Endgegner ist drin, nun muss ich das alles noch so umsetzen, dass der Endgegner mit ein wenig KI gegen das Hauptschiff kämpfen kann... Dann Fehlerbereinigung und testen testen testen... und das kann mein Freund Janko schon jetzt parallel machen... ich werde mein Intro noch anpassen: Soundengine und Test: Janko. ;-)

Antworten

... genug programmiert... jetzt muss ich ins Bett! Habe gerade noch eine Unzahl an Bugs gesehen beim Spielen!! Da steckt noch viel Arbeit drin. Das mit dem HighScore ist ne coole Sache... will ich unbedingt auch noch reinbringen... vielleicht bist du bald firm und kannst mir dann ein paar Tips geben ;-) Grüße Peter

Antworten

Hallo Janko, vielen Dank für dein Feedback! Die Kollisionserkennung ist echt tricky... wenn ich alles fertig habe, dann kümmere ich mich darum bis es 100% läuft! Die Raumschiffe im Zwischenlevel kommen zufällig, man kann sie auch abschiessen... ich könnte das aber etwas entschärfen! Das mit dem HighScore ist schon super... tolle Arbeit! Gruß Peter

Antworten

Prodehl schrieb: Die Raumschiffe im Zwischenlevel kommen zufällig, man kann sie auch abschiessen... ich könnte das aber etwas entschärfen!

Hi!

Das man die abschließen kann, wusste ich nicht. Ich habe es probiert und es hatte nicht funktioniert. Dann hatte ich wohl Pech mit der Erkennung und deshalb gedacht, man muss die Raumschiffe umschiffen :-)

Was mich auch immer wieder irritiert ist, dass wenn man zu weit nach oben fliegt, man plötzlich in der Mitte des Bildschirms sich befindet. Ist das so gewollt? Schön wäre, wenn man dann oben einfach stehen bleibt.

Grüße Janko

Antworten

Man kann noch (!!) an den oberen Rand fliegen und ist dort sicher... ich nutze das um die Level zu testen... später wird man natürlich oben am Rand bleiben und nicht weiter hoch kommen... ich werde das mal so fixen, daß man jetzt nicht in die Mitte kommt.

Antworten

Hallo!

Wenn die Breite mancher Barrieren/Effekte vorgegeben ist, dann ist das so. Das ist bei meinem Spiel ja nicht anders. Ich wusste es nur nicht bei Deinem Spiel. Mir sind diese Lücken nur aufgefallen und habe mich deshalb gewundert. Meine Strombarriere ist auch fix 3 Zeichen breit. Deshalb ist dann mein Spielfeld an diesen Stellen immer etwas "verengt" :-)

Beim Zwischenspiel mit den Raumschiffen ist mir auch aufgefallen, dass sobald die Musik sich zurückändert und man noch ein letztes Raumschiff abschießt, diese Explosion ohne ruckeln stattfindet.

Grüße Janko

Antworten

... das muss ich anders machen ... ich habe ja relativ aufwendig es geschafft, die Explosionen mitscrollen zu lassen. Das ging nur indem ich den fein- und grobscroll in die Animation der Explosionen integriert habe. In dem Part 2, wo ich kein automatisches scroll habe musste ich ein andere 2. Feinscrollroutine bauen, da ich sonst bei jedem Schuss zwangsruntergescrollt wurde. Die Hintergrundmusik läuft aber im Feinscroll, daher habe ich für die Zwischenlevel die andere Feinscrollroutine benutzt... ich baue das jetzt mal so um, daß ich die komplexe Routine auch für die Zwischenlevel benutze und dann einfach die Musikstücke jeweils in der Musikini ändere...

Antworten

Hi!

Kann es sein, dass die Zwischensequenz kürzer geworden ist? Ansonsten topp, dass das Ruckeln weg ist.

$1400 scheint zu $1000 nichts zu ändern. uDOS, was so sparsam sein soll, geht immer noch nicht. Dann kannst Du auch bei $1000 bleiben und einen Game-Loader nutzen. Nur abspeichern kannst Du dann leider nichts.

Grüße Janko

Antworten

Hi Janko, ich habe dir gerade eine neue xex gesendet.... habe viel an dem Programm gearbeitet und du darfst schon mal den ersten Einblick in das Finale bekommen.... das Programm startet also jetzt zum testen ganz unten in den Landschaft! Das Programm fängt jetzt bei $1800 an - vielleicht geht es jetzt mit einem kleinen Dos - das wäre mal interessant zu wissen... noch mehr geht auf keinen Fall! Die Schüsse habe ich fast gefixt... der rechte geht jetzt perfekt, den linken Schuss kann man mehrfach starten. Hier stimmt noch irgendwo eine Variable nicht ganz... Der Endkampf ist nun fast fertig, da brauche ich noch etwas mehr KI und das Alienraumschiff zuckt noch zu viel. Die Zwischenlevel habe ich jetzt fertig, kürzer waren die in der Tat zum Testen, jetzt wieder normal lang. Hier habe ich noch einen ganz kleinen Bug, der wohl kaum auffällt. Ein neuer Bug ist aufgetreten bei der Raumschiffexplosion... da gehe ich später ran. Nach dem Endkampf überarbeite ich die Landschaft, die du danach gerne testen sollst... etwas Code-Bereinigung und dann kommt meine volle Konzentration (wenn alles andere fertig ist) nochmal auf die Explosionserkennung der Items und der blauen Raumschiffe nach einem Treffer.

Übrigens siehst du sicherlich am Ende der Landschaft einen nach rechts unten führenden Durchgang... wenn man den Endgegner besiegt hat, soll das Raumschiff automatisch landen und ein Player geht durch den Gang in Richtung RtP II ;-) Grüße Peter

Antworten

Hallo!

habe Dir eine Mail geschickt.

Dein Endboss klebt ein wenig zu sehr an dem Spieler und schießt dann auch noch zwei Geschosse hintereinander ab. Das ist etwas heftig. Auch schießt dieser schon, bevor Du ihn siehst. Vllt. solltest Du den letzten Meter den Spieler automatisch gegenüber des Endgegners fliegen, kurze Melodie und dann geht der Kampf los?

Vllt. eignet sich die Musik aus den Zwischenleveln?

Grüße Janko

Antworten

Hallo!

Holger - Rockford - hat sich bei mir am Mittwoch gemeldet, dass mein Spiel angekommen ist und er es sich am Wochenende anschauen will. Bin gespannt ob es angenommen wird. Holger meinte aber schon vorab, dass i.d.R. wg. Urheberprobleme Software aussortiert wird und nicht wg. ungenügender Qualität. Dennoch habe ich Schiess, dass genau bei Holger ein Mega-Bug auftritt :shock:

Grüße Janko

Antworten

Hallo Janko, Glückwunsch zum Glasfaser!!! Was dein Spiel angeht: Da würde ich mir keine großen Sorgen machen. Das Spiel läuft doch superstabil und wirkt absolut professionell... im Gegensatz zu RtP !! Bei RtP gibt es viel mehr Probleme mit Bugs... auch überlege ich, ob ich die Items grafisch noch ein wenig ändere, da sie zum Originalspiel identisch sind... also TNT, die Rakete und der Öltank sind von mir absolut gleich gebaut worden... da habe ich viel mehr Bedenken, daß das ein Problem wird. Wie siehst du das??? Liebe Grüße Peter

Antworten

hmmmm .... ich denke ich werde da auf Nummer sicher gehen und das Spiel umbenennen und die Items einfach grafisch noch abändern. Dann wird es auch keine Probleme geben! Grüße Peter

Antworten

... mein Spiel wurde jetzt umbenannt zu Battle Of Eris - Eris ist ein Zwergplanet unseres Sonnensystems und wurde erst kürzlich entdeckt! Die 4 Items werde ich umarbeiten, dann sollte alles safe sein.

Monstermampf .. ja, das sah dem Original recht ähnlich, gut, daß du das umgestaltet hast.... sieht jetzt auch optisch viel besser aus!!

Antworten

Moin moin... wie gehts dir? Hast du schon was von Holger gehört? Ist dein Spiel angenommen?

Am WE habe ich ein wenig Namen und die Grafik der Items umgestellt und so müsste es ok sein... Außerdem habe ich am Endgegner gearbeitet - das läuft jetzt ganz gut und der Endgegner läuft schön flüssig von rechts nach links und ist nicht mehr am eigenen Raumschiff gekoppelt. Da sind noch ein paar kleine Bugs bei der Explosion drin, dann das Extro fertig machen und dann bin ich so erstmal "durch". Danach gehe ich über die Landschaft rüber und dann kommt die eigentliche Testphase (dein Einsatz) und meine Kollisionskorrektur, die ich grundsätzlich überarbeiten werde. Und dann ist das Game fertig... Grüße Peter

Antworten

Hi Janko, wie hast du das so schnell hinbekommen?? Echt gut! Ist ein wenig ähnlich wie Pitfall ... echt super!! Mach mal weiter - das wird gut!

Ich habe die letzte Zeit viel gearbeitet, Nachtdienste und Garteneinsätze... alle übrige Zeit ging in Battle Of Eris! Heute habe ich praktisch die letzten Programmteile beendet! Der Endkampf mit dem Alienraumschiff ist jetzt fertig, man kann dann final auf der kleinen Plattform landen und dann kommt der Abspann mit dem Hinweis auf Teil 2. Danach kann man weiterklicken und neu starten. Die Player funktionieren jetzt alle und die meisten Bugs habe ich beseitigt beim Endkampf. Man kann das Spiel jetzt komplett durchspielen. Restspeicher noch 1300 Bytes.

Was folgt jetzt? Ich gehe jetzt die Landschaft komplett durch und teste auf Logik und Spielbarkeit. Die Zwischenlevel werde ich jetzt an sinnvollen Stellen einsetzen, ich muss noch ein paar Startpunkte einsetzen, wo das Raumschiff nach Explosion weiterfliegen kann. Dann darfst du intensiv testen. Meine Frau kümmert sich um das Englisch ;-) Danach kommen ein paar Screenshots und die Beschreibung - danach muss ich eine ATR aus der Datei machen (vielleicht hilfst du mir dabei) und dann wird es eingereicht... puhhhhh Liebe Grüße Peter

Antworten

... ich sehe es auch gerade...echt komisch! Frag mal nach!! Die Konkurrenz scheint groß dieses Jahr! Lars Langhans hat schon gute Sachen gemacht.. puh!

Antworten

Hallo Peter,

es ist heiß und man sitzt nicht gerne vorm Rechner... Dann ist gestern auch noch Nachbars Katze, auf die ich gerade aufpasse, gestorben. Mit 15 Jahren nicht ungewöhnlich, dennoch sehr traurig. Gestern wurden die Fäden an der Hand meiner Frau entfernt (Schnellender Finger?) und die Wunde hat sich wieder tlw. geöffnet :-( Und heute ruft die Lehrerin meines Sohnes an und erzält uns, dass unser Sohn nicht an den Abschlussarbeiten der 10. Klasse teilgenommen hat, ob er krank war?! Es stellte sich später heraus, dass er Teilgenommen hat und nur intern eine falsche Info weitergegeben wurde... Wir haben zwar unserem Sohn geglaubt, dennoch war der Anruf ersteinmal ein Schock. Nach meiner Arbeit (am PC) falle ich daher, körperlich und geistig erschöpft, einfach aufs Sofa.

Bitte Verzeih mir deshalb, dass ich noch nicht Deine neue Beta testen konnte. Mach ich aber noch!

Grüße Janko

Antworten

Hallo Janko, gar kein Problem und mach es einfach wenn du Zeit findest... solche Katastrophenphasen kenne ich nur zu gut. Ich habe es tatsächlich geschafft das Spiel einmal durchzuspielen bis zum Endgegner.. ist nicht einfach! Vor allem, weil die Schusserkennung noch nicht gut genug ist. Daher habe ich jetzt erstmal etwas daran gearbeitet. Die Schusserkennung ist jetzt noch nicht perfekt, aber deutlich besser und die Schüsse laufen schneller. Das Gesamtspiel läuft etwas langsamer und ist daher spielbarer.... und jetzt gehe ich dann die nächsten Tage an die Itemkollisionserkennung. Die muss perfekt werden! Ich sende dir gleich mal die nächste Beta rüber mit den etwas besseren Schüssen! Grüße Peter

Antworten

Hallo Janko, gerade schlage ich mich mit dem Highscore rum und habe bemerkt, daß ich da beim Score noch kleine Fehler drin habe. Diesen Part muss ich nochmal etwas überarbeiten, da ich ja auch noch diesen Highscore reinbringen möchte. Deinen Code habe ich mal ausprobiert, irgendwie ging es aber nicht so richtig. Ich habe ja ein Datei angelegt (HSC.DTA) und in die .atr kopiert, aber er kann darauf nicht richtig zugreifen... da muss ich nochmal mich intensiver mit beschäftigen. Dein Code ist schon sehr professionell, aber mir reicht erstmal nur aus, wenn ich eine 16 Bit Zahl von der Datei laden und speichern kann... Dann muss ich mich noch darum kümmern, wie ich am besten eine 16-bit Zahl (z.B. $1234 / 4660) nicht in Bit-Form umrechne, sondern in Charaktergrafik. Ich gebe ja für eine 5-stellige Zahl auf den Bildschirm 5 Charakter nebeneinander aus - also aus der Zahl 4660 mache ich 0 4 6 6 0 und gebe dann entsprechend auf den Bildschirm die Charakter 32,36,38,38,32 aus. Meine Null fängt bei 32 an. Mir fällt als einzige gute Möglichkeit tatsächlich nur eine Schleife ein, wo ich dann die entsprechenden 5 Speicherstellen hochzähle. Wahrscheinlich gehts viel viel einfacher... Grüße Peter

Antworten

Hallo!

Ja mit der Ausgabe von Zahlen tue ich mich auch schwer...

Ich wandle zuerst die Binärzahlen in Dezimalzahlen:

;######################################################### ; # Binär nach Dezimal (BCD) Umwandlung ; #

  .proc BINBCD16

    sed       ; Switch to decimal mode
        lda #0        ; Ensure the result is clear
        sta BCD+0 
        sta BCD+1
        sta BCD+2
        ldx #16       ; The number of source bits

@ asl BIN+0 ; Shift out one bit rol BIN+1 lda BCD+0 ; And add into result adc BCD+0 sta BCD+0 lda BCD+1 ; propagating any carry adc BCD+1 sta BCD+1 lda BCD+2 ; ... thru whole result adc BCD+2 sta BCD+2 dex ; And repeat for next bit bne @- cld ; Back to binary

  rts

BIN .word 12345 BCD .DS 3 ; 45 23 01

  .end

Anschließend kann ich diese Ausgeben:

; ### Punkte ausgeben lda #$10 ; Farbwahl der Zahlausgabe sta CHPOS ; Durch Addition zum CHR

  lda GamePoint
  sta BINBCD16.BIN
  lda GamePoint+1
  sta BINBCD16.BIN+1
  jsr BINBCD16
  ldx #0        
  ldy #3
  jsr AusgabeConv

Wobei die eigentliche Ausgabe hier gemacht wird:

AusgabeConv dey clc lda BINBCD16.BCD,y and #%11110000 lsr lsr lsr lsr adc CHPOS sta StatusScrMem,x inx clc lda BINBCD16.BCD,y and #%00001111 adc CHPOS sta StatusScrMem,x inx cpy #$00 bne AusgabeConv rts

Das wäre sicherlich mal eine Frage fürs Forum, wie man optimiert am schnellsten Zahlen aus einem 16 Bit-Word in eine 5-stellige Zahl auf dem Bildschirm wandeln kann.

Janko

Antworten

wobei... so ganz gepeilt habe ich deinen Code nicht, wenn ich ganz ehrlich bin ...

Antworten

so ganz durchdrungen habe ich die Umwandlung der Zahlen noch nicht... und wie geht das dann wohl mit 16 Bit?? Das erscheint aber wichtig zu verstehen... vielleicht kannst du das ja noch verständlicher einem Laien wie mir erklären ;-) Schränker 2 schaue ich mir gleich mal an!!!

Antworten

... das Spiel wird richtig gut!! Vielleicht machst du noch rein, daß er springen kann. An der Treppe kann es noch hakelig werden und er hängt, obwohl er schon drauf ist und nach oben geht. Lustig: Wenn man auf einem Schlüssel ist und nach unten steuert, fällt man durch die Mauer wenn die nicht zu dick ist. Optisch schon richtig gut das Spiel!!!! Weiter so! Lieben Gruß Peter

Antworten

Die Routine BIN2BCD kann theoretisch 8Bit, 16Bit, 24Bit, 32Bit... umsetzen. Wenn man 32Bit umsetzen möchte, muss der Loop statt 16x halt 32x durchgeführt werden und ggf. noch ein 4. bzw. 5. Byte für die Ziffern parat gehalten werden.

Ich weiß nur leider nicht, wo genau Du Dein Verständnisproblem hast. Ich habe mich damit so beschäftigt, dass ich das nicht erkenne.

Grüße Janko

Antworten

Es gibt da noch einige Themen, mit denen ich mich intensiver beschäftigen muss. Zum einen das Thema der Speicherung auf Diskette, das hat bei mir noch nicht geklappt...das brauche ich jetzt aber noch relativ zeitnah, damit ich den Highscore auch abspeichern kann. Den Scorezähler habe ich ja drin und finde ihn jetzt für meine Zwecke recht praktisch. Man trifft ein Item und der Scorezähler zählt einfach den entsprechenden Betrag hoch und speichert das direkt in den Score (bestehend aus 4 Bytes - Byte 1, also 1. Ziffer ist bei mir immer Null) sichtbar ab. Diesen Score speicher ich auch dann direkt auf Diskette. Ich brauche also gar keine 16 Bit Zahl. Dennoch möchte ich es verstehen und werde das wenn BoE fertig ist mal tiefer durchdringen. Außerdem werde ich mich nach BoE noch ein wenig mit dem DLI beschäftigen, bevor ich dann BoE II anfange... man muss sich Aufgaben stellen ;-) Gruß Peter

Antworten

wenn ich also in den Dezimalmodus schalte, dann habe ich automatisch in dem Moment, wenn ich irgendwelche Bytes benutze nur noch maximal 99 als Dezimalwert. Sobald ich mit der ganzen Berechnung fertig bin, muss ich wieder umschalten, weil sonst alles durcheinander gerät. Er ignoriert quasi alles oberhalb von 1100011. Und wenn du dann durch die AND Berechnung den oberen Nibbel auf Null bringst, hast du die rechte Ziffer, wenn du den unteren Nibbel auf Null bringst und 4x nach rechts shiftest, hast du die linke Ziffer. Stimmt so?

Antworten

... ach nee, den oberen Nibbel muss ich nur nach rechts shiften und bekomme den entsprechenden Wert. Die beiden 4 er Blöcke werden dann so organisiert, dass jeweils bei 1001 "Schluss" ist und nach 1001 im unteren Bereich alles auf Null geht und der obere um 1 Bit höher gesetzt wird... ich glaube jetzt habe ich es verstanden.. vielen Dank Janko!!! Dann ist der Dezimalmodus ja echt geil und wichtig! Die Entwickler wussten schon, was man braucht!!!!

Antworten

Hallo Janko, ich brauche mal wieder ein wenig Hilfe! Ich bekomme nichts abgespeichert... Thema HighScore. Wo ist der Fehler?? Folgenden Code habe ich:

Open: ldx #2*16 lda #3 ;Open Befehlscode sta iccom,x lda #FILE sta icbah,x lda #8 ;8=schreiben 4=lesen sta icax1,x jsr ciov

    rts

lesen: ldx #2*16 lda #7 ;lesen Befehl sta iccom,x lda #0 ;Bufferlänge Null sta icbll,x sta icblh,x jsr ciov bmi @+ rts @
jmp * ;error rts

schreiben: pha ;zu schreibender Wert muss im Akku stehen - Wert merken ldx #2*16 lda #11 ;Befehl schreiben sta iccom,x lda #0 ;einen Wert schreiben sta icbll,x sta icblh,x pla ;Wert holen jsr ciov ;Wert ablegen cpy #0 bmi @+ rts @
jmp * ;error rts

Close:

ldx #2*16 lda #12 ;Befehl Close sta iccom,x jsr ciov rts

die Datei oben definiert:

FILE .byte "D:HS.DTA",$98

ich bekomme aber nur einen Fehler raus... wo ist der Fehler?? Gruß Peter

Antworten

Hallo!

Du musst einen Zeiger auf die Daten setzen, die gelesen bzw. geschrieben werden sollen und angeben wieviele es sein sollen. Du gibt 0 als Länge an und versuchst die Daten über den Akkumulator zu übergeben, diese Variante kenne ich nicht und gibt es evtl. gar nicht.

HighScore .byte 00,00

  .proc ExecFile
  ldx #KanalNr      ; Kanal auswählen
  lda ExecRW      ;  Befehl lesen oder schreiben
  sta ICCOM,x     ; CIO Kommando ablegen

  lda #<HighScore     ; Daten, die übertragen/geladen werden sollen
  sta ICBAL,x
  lda #>HighScore
  sta ICBAH,x

  lda #$02      ; es werden nur 2 Bytes übertragen
  sta ICBLL,x
  lda #$00
  sta ICBLH,x

  jsr CIOV
  rts
  .end

Das Forum hakt, weshalb ich hoffe, dass mein Text übertragen wird :-) Grüße Janko

Antworten

Hi Janko, den Code habe ich aus der Hexenküche. Man kann wohl auch einzelne Bytes aus dem Akku übertragen... Ist aber schwierig zu testen und irgendetwas stimmt noch nicht. Gruß Peter

Antworten

ich bekomme es einfach nicht hin... ich zeige dir nochmal die Parameter, vielleicht erkennst du ja den Fehler...

FILE dta 'D:HS2.DTA',$9b

...

.proc open ldx #116 lda #3 ;Open Befehlscode sta iccom,x lda #FILE sta icbah,x lda #8 ;8=schreiben 4=lesen sta icax1,x jsr ciov rts .endp .proc schreiben ;ein Wert schreiben lda #111 pha ;zu schreibender Wert muss im Akku stehen - Wert merken ldx #116 lda #11 ;Befehl schreiben sta iccom,x lda #0 ;einen Wert schreiben sta icbll,x sta icblh,x pla ;Wert holen jsr ciov ;Wert ablegen cpy #0 bmi @+ rts @
;jmp * ;error rts .endp .proc lesen ;ein ert lesen

    ldx #1*16
    lda #7      ;lesen Befehl
    sta iccom,x
    lda #0      ;Bufferlänge Null
    sta icbll,x
    sta icblh,x
    jsr ciov
    ;bmi @+
    rts

@
;jmp * ;error rts .endp .proc schreibenblock ldx #2*16 lda #11 sta iccom,x lda #0 sta icbal,x lda #$80 sta icbah,x ;Schreibblock ab $8000 lda #0 sta icbll,x lda #$20 sta icblh,x ;Länge Block $2000 jsr ciov bmi @+ rts @ ;error

    rts
.endp
.proc lesenblock
    ldx #1*16
    lda #7      ;Befehl lesen
    sta iccom,x
    lda #<hs5
    sta icbal,x
    lda #>hs5
    sta icbah,x   ;Anfangsadresse Datenblock
    lda #2
    sta icbll,x
    lda #0
    sta icblh,x   ;Länge Block $2000
    jsr ciov
    rts
.endp
.proc close
    ldx 1*16
    lda #12     ;Befehl Close
    sta iccom,x
    jsr ciov
    rts
.endp

in hs5 soll der Highscore rein

LG Peter

Antworten

ich hab es ich Trottel versuche die ganze Zeit zu lesen und habe die open-Funktion auf schreiben gesetzt .... oh mein Gott... da habe ich jetzt ein paar Stunden dran gesessen...

Antworten

Hallo!

Das hier ist ein funktionierendes Beispiel. Natürlich nur, wenn ein DOS geladen ist :-)

Grüße Janko

  org $8000

; CIO Kommandblock CIOV equ $E456 ICHID equ $340 ICDNO equ $341 ICCOM equ $342 ICSTA equ $343 ICBAL equ $344 ICBAH equ $345 ICBTL equ $346
ICBTH equ $347 ICBLL equ $348 ICBLH equ $349 ICAUX1 equ $34A
ICAUX2 equ $34B
ICAUX3 equ $34C
ICAUX4 equ $34D
ICAUX5 equ $34E
ICAUX6 equ $34F

KanalNr equ 1*$10 ; KanalNr * 16!

Dateiname dta c'D:HSCORE.DTA',$9b ; Dateiname OpenRW .byte $04 ; $04 = Lesen / $08 = Schreiben ExecRW .byte $07 ; $07 = Lese Zeichen / $0B = Schreibe Zeichen

FehlerLesen dta c'Highscore nicht lesbar!',$9b FehlerSchreiben dta c'Highscore nicht beschreibbar!',$9b

HighScoreRW .byte $00 ; $00 = Lesen/Schreiben OK / $01 = Fehler HighScore .word $1000 HighScoreText dta c'Highscore: ' HighScoreTxt dta c'000000',$9b

;############################################################################## ;### Open ;###
.proc OpenFile

  ldx #KanalNr      ; Kanal auswählen
  lda #$03      ; Kommado für Kanal öffnen
  sta ICCOM,x     ; CIO Kommando ablegen

  lda #<Dateiname     ; Dateiname holen
  sta ICBAL,x     ; und CIO übergeben
  lda #>Dateiname
  sta ICBAH,x

  lda OpenRW      ; Lesen / Schreiben
  sta ICAUX1,x      ; CIO Kommando ablegen

  jsr CIOV
  rts
  .end

;############################################################################## ;### Close ;###
.proc CloseFile

  ldx #KanalNr      ; Kanal auswählen
  lda #$0c      ; Kommado für Kanal schließen
  sta ICCOM,x     ; CIO Kommando ablegen

  jsr CIOV
  rts
  .end

;############################################################################## ;### Read / Write ;###
.proc ExecFile ldx #KanalNr ; Kanal auswählen lda ExecRW ; Kommado für Kanal schließen sta ICCOM,x ; CIO Kommando ablegen

  lda #<HighScore     ; Daten, die übertragen/geladen werden sollen
  sta ICBAL,x
  lda #>HighScore
  sta ICBAH,x

  lda #$02      ; es werden nur 2 Bytes übertragen
  sta ICBLL,x
  lda #$00
  sta ICBLH,x

  jsr CIOV
  rts
  .end

;############################################################################## ;### Textausgabe ;###
.proc TextAusgabe
ldx #$00 ; Textaushabe auf die Standardausgabe sta ICBAL,x tya sta ICBAH,x

  lda #$09      ; Kommando Schreiben (PUT RECORD)
  sta ICCOM,x

  lda #$ff      ; max 255 Zeichen ausgeben
  sta ICBLL,x
  lda #$00
  sta ICBLH,x

  jsr CIOV
  rts
  .end

;############################################################################## ;### Highscore lesen ;###
.proc HighScore_lesen lda HighScoreRW bne Exit

  lda #$04      ; Kommando "LESEN" setzen
  sta OpenRW
  jsr OpenFile      ; Datei öffnen
  bmi Fehler      ; bei Fehler abbrechen

  lda #$07      ; Kommando "ZEICHEN LESEN" setzen
  sta ExecRW      
  jsr ExecFile      ; Datei einlesen (Highscore)

Close jsr CloseFile ; Kommando "CLOSE" für den Kanal Exit rts

Fehler sty HighScoreRW ; Fehler merken jmp Close

  .end

;############################################################################## ;### Highscore schreiben ;###
.proc HighScore_schreiben lda HighScoreRW bne Exit

  lda #$08      ; Kommando "SCHREIBEN" setzen
  sta OpenRW
  jsr OpenFile      ; Datei öffnen (erzeugen)
  bmi Fehler      ; bei Fehler abbrechen

  lda #$0B      ; Kommando "ZEICHEN SCHREIBEN" setzen
  sta ExecRW      
  jsr ExecFile      ; Datei schreiben (Highscore)

Close jsr CloseFile ; Kommando "CLOSE" für den Kanal Exit rts

Fehler sty HighScoreRW ; Fehler merken jmp Close

  .end

;############################################################################## ;### Fehler ausgeben ;### .proc FehlerAusgeben

Lesen lda HighScoreRW ; Nur ausführen wenn ein Fehler vorhanden beq Exit
lda FehlerLesen jsr TextAusgabe ; Text über Standardausgabe raus Exit rts

Schreiben lda HighScoreRW ; Nur ausführen wenn ein Fehler vorhanden beq Exit lda FehlerSchreiben jsr TextAusgabe ; Text über Standardausgabe raus rts

  .end

;############################################################################## ;### HighScore ausgeben ;### .proc HighScoreAusgeben

  lda <HighScoreText    ; Fehlertext adressieren
  ldy >HighScoreText
  jsr TextAusgabe     ; Text über Standardausgabe raus

Exit rts .end ;############################################################################## ;### Binär nach Dezimal (BCD) Umwandlung ;### .proc Konvert_HighScore

    sed           ; Dezimalmode einschalten
        lda #0            ; BCD löschen (nullen)
        sta BCD+0 
        sta BCD+1
        sta BCD+2
        ldx #16           ; Die Anzahl der Bits definieren

@ asl BIN+0
rol BIN+1 lda BCD+0
adc BCD+0 sta BCD+0 lda BCD+1
adc BCD+1 sta BCD+1 lda BCD+2
adc BCD+2 sta BCD+2 dex
bne @- cld ; Binärmode aktivieren

  ldy #$03      ; eine 6-stellige Zahl generieren

@ dey clc lda BCD,y and #%11110000 lsr lsr lsr lsr adc #$30 sta HighScoreTxt,x inx clc lda BCD,y and #%00001111 adc #$30 sta HighScoreTxt,x inx cpy #$00 bne @- rts

BIN equ Highscore BCD .DS 3

  .end

;############################################################################## ;### Hauptprogramm ;###
.proc main jsr HighScore_schreiben ; Da keine Datei existiert erst schreiben jsr FehlerAusgeben.Schreiben

  lda #$00      ; Highscore löschen
  sta HighScore
  sta HighScore+1

  jsr HighScore_lesen   ; und Highscore wieder einlesen
  jsr FehlerAusgeben.Lesen

  jsr Konvert_HighScore
  jsr HighScoreAusgeben

  rts
  .end

  run main
Antworten

Hallo und guten "Morgen" Janko, vielen Dank für deine Hilfe. Ich habe es jetzt auch dank dir und dank der Hexenküche von Peter Finzel hinbekommen. Gestern und heute habe ich den Highscore programmiert. Man liest den HighScore von Diskette - es gibt Rang 1-5 - dann wird im Intro der laufende Text angezeigt, der Highscore wird danach gezeigt und man startet das Spiel irgendwann. Wenn GameOver gleicht das Programm den aktuellen Score mit Rang 1-5 vom HighScore ab, falls man einen Rang zwischen 1-5 belegt speichert das Programm den aktuelle Score an die entsprechende Position und mit dem Joystick gibt man noch seine 3 Initialen ein. Das wird dann im Highscore aktualisiert und auf Diskette abgespeichert und dann auch auf dem Bildschirm angezeigt. Das ist alles jetzt drin, hat aber noch ein paar Fehler - die bügel ich die nächsten Tage noch aus. Mein Speicher ist jetzt auch randvoll... nur noch ca. 50 Bytes übrig. Falls noch was nötig ist zur Fehlerkorrektur, muss ich die Landschaft etwas kürzen... allerdings habe ich noch ein paar Stellen im Code, die ich straffen könnte. Meine Frau ist nächste Woche ab Mittwoch auf Achse und da werde ich sehr viel und intensiv die Reste fertig stellen... dann gehts nochmal zu dir zum testen und dann zu Holger! Bis hierhin bin ich schon echt zufrieden! Wie geht es bei dir? Kommst du weiter, oder startest du erst voll, wenn ich mit BoE II anfange ;-) ?

Grüße Peter

Antworten

Hi!

Hört sich gut an mit dem Highscore! Ich programmiere auch nebenbei ein wenig und habe wieder dazugelernt. Ein JSR -> RTS benötigt 12 Maschinenzyklen. Also sollte man in einer Schleife lieber Spaghetti-Code schreiben, als JSR/RTS zu nutzen. Dazu nutze ich die Makro-Fähigkeit. So programmiere ich z.B. das Erkennen des Spinnennetz nur 1x und setze diese Makro aber dann in alle 4 Richtungskontrollen ein. Das spart natürlich keinen Speicherplatz, aber Rechenzeit. Man muss also das Optimum zwischen Speicherplatz und Rechenzeit herauskitzeln :-) Ausserdem muss die Grafikberechnung vorm Grafikaufbau des ANTIC fertig sein... aber die Musik kann theoretisch während des Bildaufbaus bearbeitet werden. Die Reihenfolge ist also das interessant. So langsam verstehe ich die Grundlegenden Sachen. Ich will mal ausprobieren statt im VBI die Musik im DLI laufen zu lassen. Damit müsste diese auch sehr konstant und sauber laufen... mal schauen. Noch bin ich nicht soweit.

Meine Geister schwirren nun richtig schön durch die Gegend... hinter Mauern hindurch und erkennbar beweglich. Meine Spinnen klettern im Netz umher und warten nur auf ihr Opfer :-)

Komme nur langsam voran, aber ich freue mich immer wieder, wenn ich sehe wie gut es aktuell läuft. Nur habe ich schon angst, dass ich Rechenzeitprobleme bekomme. Notfalls im PAL mit Musik und in NTSC ohne Musik oder so? Muss ich noch schauen.

Grüße Janko

Antworten

Hi Janko, ich sende dir nochmal meinen Code! Der Highscore ist fast fertig, aber er läßt sich nicht auf Diskette abspeichern! Beim Intro wird der Highscore von Diskette geladen und angezeigt. Das funktioniert alles. Man startet das Spiel und wenn man keine Schiffe mehr hat, trägt man seine Initialen ein und der Score wird unter HS1 gespeichert - man springt ins Intro und da wird der neue Highscore korrekt angezeigt. Vorher kommt die Abspeicherroutine, die das Ergebnis auf Diskette in die HS2.DTA. Datei abspeichern soll. Er springt auch in die Routine (das habe ich getestet), aber leider speichert er nichts auf Diskette... siehst du den Fehler??? Also laden von Diskette geht aber speichern nicht... Gruß Peter

    FILE  dta c'D:HS2.DTA',$9b
    ...
    mva #8 rw   ;Blöcke schreiben
    jsr open
    jsr schreibenblock
    jsr close
    ...

.proc open
    ldx #1*16
    lda #3      ;Open Befehlscode
    sta iccom,x
    lda #<FILE
    sta icbal,x
    lda #>FILE
    sta icbah,x
    lda rw      ;8=schreiben  4=lesen
    sta icax1,x
    jsr ciov
    rts
.endp
.proc schreibenblock
    ldx #1*16
    lda #11
    sta iccom,x
    lda #<hs1
    sta icbal,x
    lda #>hs1
    sta icbah,x   ;Schreibblock 
    lda #18
    sta icbll,x
    lda #0
    sta icblh,x   ;Länge Block
    jsr ciov

    rts

.endp
.proc lesenblock
    ldx #1*16
    lda #7      ;Befehl lesen
    sta iccom,x
    lda #<hs1
    sta icbal,x
    lda #>hs1
    sta icbah,x   ;Anfangsadresse Datenblock
    lda #18
    sta icbll,x
    lda #0
    sta icblh,x   ;Länge Block 
    jsr ciov
    rts
.endp
.proc close
    ldx 1*16
    lda #12     ;Befehl Close
    sta iccom,x
    jsr ciov
    rts
.endp
Antworten

Hallo!

Ich verstehe es nicht, aber Deine Routine schreibt unendlich viele Zeichen... aber warum? Da werde ich noch ein wenig analysieren müssen.

Grüße Janko

Antworten

... zumal die Leseroutine ganz normal funktioniert und ja fast identisch aufgebaut ist...

Antworten

Hallo!

Ich kann Dir echt nicht sagen, woran es gelegen hat. Ob Du ausversehen ein Label doppelt benannt hast oder keine Ahnung. Namen wir "open" oder "close" besser nicht nutzen, die sind bestimmt irgendwo definiert :-) Der Code funktioniert... aber wo der Fehler war...

  org $2000

; CIO Kommandblock CIOV equ $E456 ICHID equ $340 ICDNO equ $341 ICCOM equ $342 ICSTA equ $343 ICBAL equ $344 ICBAH equ $345 ICBTL equ $346
ICBTH equ $347 ICBLL equ $348 ICBLH equ $349 ICAUX1 equ $34A
ICAUX2 equ $34B
ICAUX3 equ $34C
ICAUX4 equ $34D
ICAUX5 equ $34E
ICAUX6 equ $34F VCOUNT equ $d40b COLPF0 equ $d016 COLPF1 equ $d017 COLPF2 equ $d018 COLPF3 equ $d019 COLBK equ $d01a

Dateiname dta c'D:HSCORE.DTA',$9b ; Dateiname KanalNr equ 1*$10 OpenRW .he 08

;############################################################################## ;### Open ;###
.proc OpenFile

  ldx #KanalNr      ; Kanal auswählen
  lda #$03      ; Kommado für Kanal öffnen
  sta ICCOM,x     ; CIO Kommando ablegen

  lda #<Dateiname     ; Dateiname holen
  sta ICBAL,x     ; und CIO übergeben
  lda #>Dateiname
  sta ICBAH,x

  lda OpenRW      ; Lesen / Schreiben
  sta ICAUX1,x      ; CIO Kommando ablegen

  jsr CIOV
  rts
  .end

;############################################################################## ;### Close ;###
.proc CloseFile

  ldx #KanalNr      ; Kanal auswählen
  lda #$0c      ; Kommado für Kanal schließen
  sta ICCOM,x     ; CIO Kommando ablegen

  jsr CIOV
  rts
  .end

;############################################################################## ;### Write ;###
.proc WriteFile ldx #KanalNr ; Kanal auswählen lda #$0B ; Kommado für Kanal schließen sta ICCOM,x ; CIO Kommando ablegen

  lda #<HighScore     ; Daten, die übertragen/geladen werden sollen
  sta ICBAL,x
  lda #>HighScore
  sta ICBAH,x

  lda #$12      ; es werden 12 Bytes übertragen
  sta ICBLL,x
  lda #$00
  sta ICBLH,x

  jsr CIOV
  rts         
      .end

;############################################################################## ;### Hauptprogramm ;###
.proc main lda #$08 sta OpenRW ;Blöcke schreiben

  jsr OpenFile
  jsr WriteFile
  jsr CloseFile

  .end

  run main

HighScore dta c'Dies ist ein Text!' ; 18 Zeichen

Antworten

Hallo Janko, ich habe den Code mal so übernommen, ein paar Kleinigkeiten auf meine Variablen usw. angepasst (eigentlich fast identisch zu dem Code, der nicht richtig funktionierte) ... jetzt geht es! ich denke, daß du völlig Recht hast. Er muss einen Konflikt bekommen haben mit den Wörtern open / close .. ich denke, daß die irgendwie belegt sind... Vielen Dank! Bin froh, daß das jetzt funktioniert! Gruß Peter

Antworten

... btw.... Holger braucht ja wirklich lange, um zu testen... bin auch schon gespannt auf deine neue Version von Schränker II

Antworten

Hallo!

Ja, warte auch auf eine Rückmeldung, ob alles okay ist. Aber unser Vorstand scheint insgesamt nicht so der schnellste zu sein :o Aber ist ja noch Zeit und ich denke nicht, dass es Probleme geben kann.

Bei Schränker 2 geht es aktuell gar nicht weiter. Ich habe so viel auf der Abreit zu programmieren, dass mir in der Freizeit die Lust fehlt. Ausserdem soll Schränker 2 nicht vorm 31.07. fertig werden... sonst hätte ich zwei Spiele im Wettbewerb :shock:

Morgen ist Mittwoche... dann wolltest Du ja durchstarten ;) Bin schon auf die nächste Version Deines Spiels gespannt.

Grüße Janko

Antworten

Hallo Janko, bitte teste die neue Beta noch nicht... irgendetwas ist da korrupt... Heute habe ich den ganzen Tag den Fehler versucht zu lokalisieren und zu entfernen mit dem Effekt, daß das Programm gar nicht mehr stabil läuft und hinten nur komische Sachen macht. Ich bin so ratlos, daß ich jetzt auf eine etwas frühere Version zurückgehe und die ganzen neuen Sachen (Highscore usw.) pö a pö einspiele ... meine Frau kommt doch schon heute wieder und ich werde mich um sie kümmern, am WE gehts zu ihrer Mutter nach Frankfurt, um sie nochmal zu sehen ... sie liegt mit 90 jetzt im sterben...
Ich werde jetzt die Tage nutzen und die neuen Codes in die alte Version kopieren - langsam und Schritt für Schritt - und dann muss ich mir mal an einem WE viel Zeit nehmen für den Rest. Bin ein wenig frustriert nach dem euphorischen Post von gestern, da hatte ich das Problem aber gar nicht gesehen, das es ganz hinten und völlig unverhofft auftritt... Gruß Peter

Antworten

Hallo!

Das tut mir leid, dass da noch so ein Bug enthalten war. Habe ich auch schon gehabt, dass man sucht und sucht und alles ist korrekt... bis auf so ein dummes "@" was vergessen wurde und deshalb an die falsche Stelle ständig gesprungen wird. So als Tipp, dass ist bei mir gar nicht so selten (leider).

Lass Dich aber nicht entmutigen, ich glaube das Problem kennt jeder Programmierer.

Grüße Janko

Antworten

Hallo und guten Morgen Janko, jetzt habe ich 2 komplette Tage mich intensiv mit diesem neuen Bug rumgeschlagen ... ich kann ihn nicht lokalisieren und habe etliche Stunden alles ausprobiert. Am Ende war mir klar, daß der Bildaufbau anfängt zu ruckeln, weil das System immer langsamer wurde... und das hat dann natürlich einen Konflikt mit dem Bildaufbau ausgelöst. Ich konnte dann den Programmteil relativ gut eingrenzen, wo es sporadisch auftrat und fand dann einen Variablenzähler (16 Bit), den ich dort hochlaufen ließ - ich denke es sollte ein Zähler sein für etwas, was ich dann gar nicht brauchte. Diesen Zähler habe ich dann testweise auf Remark gesetzt und seitdem tritt der Fehler nicht mehr auf... hat mich 2 Tage gekostet! Gestern Abend um 1 Uhr hab ich es gelöst und heute schon ein paar Mal getestet... und noch bin ich vorsichtig optimistisch, aber das Flackern tritt nicht mehr auf.

Das Programm ist mittlerweile sehr umfangreich und so komplex von so vielen Abläufen, daß es immer komplizierter wird. Es gibt immer noch ein paar Ablaufprobleme, die ich aber schneller beseitigen kann. Start, Intro, Spiel, Gestorben, Extro, Highscore, Intro... läuft sehr gut und rund! Start, Intro, Spiel, Endgegner, Sieg, Finale, Intro, Weiterspiel.... hier gibt es noch ein paar kleine Ablaufprobleme, da nicht alle Variablen mitgenommen werden... z.B. werden die Schiffe wieder maximal gefüllt, der Score wird schon übernommen... usw. Dann gibt es manchmal noch ein Problem mit der Explosion des Raumschiffes, wo beim Neuaufbau Elemente falsch stehen bleiben. Manchmal bugt er in den unteren Text falsche Schiffe oder Explosionen rein... das fange ich so ab, daß es wieder "repariert" wird. Bin froh, daß ich noch Zeit habe bis zur Abgabe... das Spiel soll möglichst fehlerfrei sein!!

Gruß Peter

Antworten

Hi!

Man wundert sich doch immer wieder darüber, was so alles Probleme auslösen kann. Ein Zähler der Problem auslöst... interessant. Oft sind es dann aber Kleinigkeiten wie ein vergessenen CLC bei der Addition, oder das man einen indirekten Zero-Page-Aufruf macht, ohne vorher Y auf Null zu setzen. Kenne ich alles... leider ;)

Ich drücke die Daumen, dass die weiteren Fehler schneller gefunden werden.

Grüße Janko

Antworten

autsch... habe den Fehler jetzt nicht nur gefunden, sondern auch verstanden!! Der Zähler ist definiert bei 4053... Bei 4054 habe ich die Variable grafmod definiert, die den Gafikmodus mit dem Pal-Bildschirmaufbau synchronisiert... den Zähler addiere ich aber 16 Bit, also irgendwann zählt er 4053+1 hoch (also grafmod) und das verlangsamt dann ständig und zunehmend das Programm ... und natürlich den Ruckelartefakt... oh Mann .. ;-)

Antworten

Hi!

Im Magazin #150 sind folgende Beiträge enthalten:

Schraenker-mag150.png

Da ist auch "Der Schränker" aufgeführt. Denke, dass das etwas zu bedeuten hat :mrgreen:

Grüße Janko

Antworten

Hi Janko, das freut mich für dich mit Schränker I ... das Spiel wird bestimmt weit vorne landen weil es gut ist, wobei ich natürlich die anderen gar nicht kenne. Ich werde BoE auf jeden Fall auch noch rechtzeitig einreichen, rechne mir aber keine besonders gute Platzierung aus. Das Spielprinzip ist halt einfach nicht neu und es werden sicherlich. noch zu viele Bugs übrig bleiben. Dennoch bin ich stolz auf mein allererstes Spiel diesen Umfanges und dann auch noch komplett in Assembler. Schränker II. ... das könnte noch richtig gut werden, steckt aber auch noch Arbeit drin! Mach bloß weiter, du bist gut!! Heute hatte ich kaum Zeit, denn ich war in der Handballhalle mit der Familie. Mein Kleiner ist geehrt worden (Oberligavize A-Jugend) und die erste Herren ist heute vor 2600 Zuschauern in die 1. Bundesliga aufgestiegen... da war natürlich Party angesagt. Morgen gehts zur Schwiegermama und Sonntag / Montag werde ich wohl ein wenig Zeit fürs Hobby finden... LG Peter

Antworten

Hi!

Wünsche ein schönes Pfingsten! Habe heute ein wenig rumprobiert und die "alte" Schränkermusik testweise als Hintergrundmusik ins Spiel genommen. Um den VBI zu schönen und alles schnell zu haben, spielt die Musik im DLI :-) Also mitten während des Bildaufbaus des ANTIC spielt der Pokey die Musik und es ist super! Man spart dort Zeit, wo man keine hat und dennoch läuft die Musik stabil und gleichmäßig.

Rechenzeit6502.png Rot = Rechenzeit für meine Grafikberechnung für Spielfeld, Spieler, Geister, Spinnen usw. bei 60Hz Gelb = Rechenzeit für Musik und Soundeffekte bei 60Hz

Bin begeistert :mrgreen:

Grüße Janko

Antworten

Hallo Janko, auch dir frohe Pfingsten. Gerade habe ich dir eine schon recht gute neue Version geschickt zum Testen. Ein paar Bugs habe ich noch drin, aber du kannst das gerne schon intensiv testen... Das mit dem Sound und dem DLI ist cool, in den DLI muss ich mich noch einarbeiten. Das wäre sicherlich ganz interessant mit dem Sound, ich habe ja aber drei verschiedene Sounds und müsste das in verschiedene DLIs einpacken und jeweils umschalten... ob das bei meinem Spiel stabil läuft ??? Gruß Peter

Antworten

Hi Peter!

Ich habe einen Bug gefunden, wo man unendlich Punkte generieren kann: https://www.grewe.eu/demo/UnendlichPunkteBug.m4v

Insgesamt sind es irgendwie wieder mehr Objekte, die nicht kaputt gehen, wenn man diese trifft. Aber das Hauptspiel lässt sich dennoch ganz gut spielen. Was doch nervt sind die Zwischenlevel. Diese kommen Urplötzlich, man will noch schnell etwas Öl tanken und Wumm ist man im Zwischenlevel. Wenn man im Zwischenlevel stirbt, kommt man immer mal wieder in eine Schleife. Generell finde ich die Zwischenlevel eine gute Idee, aber aktuell ist das eher Unschön als Mehrwert, weil auch hier oft ein Treffer nicht erkannt wird. Der Übergang sollte anders gelöst werden und die Treffererkennung weiterhin erhöht. Auch fühlt es sich etwas oft an, dass man ins Zwischenlevel kommt.

Grüße Janko

Antworten

Hallo Janko, den Bug für den Score habe ich heute gefunden und gelöst... puhhh! Die Trefferqualität ist mittlerweile recht gut wenn der Treffer erkannt wird. Manchmal wird ein Schuss einfach nicht erkannt und ich weiß echt nicht warum. Zur Not muss ich das leider so lassen... ich mache jetzt erstmal mit anderen Dingen weiter. Bevor ich mich um den DLI kümmere, will ich noch ein wenig an den Zwischenlevel arbeiten. Ich baue weniger davon ein und möchte sie besser platzieren. Das geht recht einfach. Thema Übergänge...die finde ich auch noch nicht optimal. Viel Platz für Code habe ich nicht mehr, aber. ein wenig geht noch... wie fändest du den Übergang zum Zwischenlevel und zurück denn gut? Eine Ankündigung per Text mit kleiner Warteschleife vielleicht??? Grüße Peter

Antworten

Habe heute einige Bugs gefixt!

Der Score im Teil II incl. richtige Schiffsexplosion ist drin. Die Zwischenlevel sollten keine Schleife mehr haben. Auch kommen sie etwas besser... hier gehe ich aber nochmal durch. Ein Endloscore sollte nicht möglich sein, ich werde den Score aber noch etwas nach unten anpassen... die Schiffe und die Mauern machen zu viele Punkte. Der Endgegner explodiert jetzt richtig, alle Punkte und Schiffe werden jetzt richtig ins weitere Spiel übernommen. Hast ne Mail für Beta 7.2 Gruß Peter

Antworten

Prodehl schrieb: ...wie fändest du den Übergang zum Zwischenlevel und zurück denn gut? Eine Ankündigung per Text mit kleiner Warteschleife vielleicht???

Die schönste Variante war die, die Du schon hattest... die 1. Wo man in Zwischenlevel reingeflogen ist.

Janko

Antworten

Hi!

Habe eben die neue Version angespielt. Die Erkennung im Hauptteil ist schon immer besser... im Zwischenlevel, wo es ja drauf ankommt um zu überleben, muss noch ein wenig justiert werden. Aber wird!

Grüße Janko

Antworten

Hi!

Ja genau so! Allerdings nimm das erste Zwischenlevel weg. Lass den Spieler ersteinmal etwas geflogen sein, bevor ein Zwischenlevel kommt.

In der dritten Phase, wo man selbst fliegt, solltest Du ggf. einen internen Timer laufen lassen und prüfen, wielange sich das Raumschiff nicht bewegt. 5 Sekunden Inaktivität lösen ein Alarm aus und der Treibstoff reduziert sich. Ggf. kannst Du so auch noch die eine oder andere Öl-Station einbringen. Und der Spieler ist gezwungen ein wenig "Gas" zu geben :-)

Grüße Janko

Antworten

... wie cool ... Ich habe jetzt den DLI eingebaut und steuere die Musik komplett über DLI und jetzt läuft alles komplett sauber und immer in gleicher Geschwindigkeit. Außerdem spare ich auch noch etwas Code!! Das scrolling bleibt ruckelfrei!! Sehr gute Idee mit dem DLI !!!

Das erste ZL lasse ich weg und einen Timer in Part 2 ist sinnvoll.. das kommt noch rein!

Liebe Grüße Peter

Antworten

Freut mich, dass das bei Dir so gut klappt. Wie gesagt, mache ich das im Schränker 2 jetzt auch so.

Antworten

bin schon auf Schränker 2 gespannt und wie du den Sprung hinbekommen hast... sa gibt es ja erhebliche Unterschiede! Irgendwo habe ich es mal gelesen, daß die Profis den Sprung möglichst realistisch programmieren - also die Erdanziehung berücksichtigen. D.h. ja beim Sprung hat man eine Kurve, wo der Sprung zunächst nach oben langsamer wird und in der Fallphase dann wieder beschleunigt... das ist sicherlich gar nicht so easy, wenn man es schön programmiert aber sicherlich ein richtig guter Effekt!

Antworten

... cool teste ich gleich mal! Bin gerade dabei das Spiel auf NTSC anzupassen... Intro und Extro ruckelt noch - das liegt vielleicht an der DL, der Rest spielt sich schon flüssig.... Sound etwas schnell vielleicht ;-)

Antworten

... habe jetzt alles auf NTSC gefixt, der Sound läuft gut und nichts ruckelt...

dein Spiel kurz angetestet... bei mir springt er nicht !

Antworten

ich habe gerade das Spiel jeweils auf PAL und NTSC auf dem 600xl 64kB und auf dem 800 48 kB getestet ... läuft auf allen Systemen am Emulator!!

Antworten

Hallo Janko, ich habe viel an BoE gearbeitet!

Die Musik läuft jetzt stabil im DLI. Bei 60 Hz noch etwas schnell, aber man kann es bei NTSC-Modus spielen. Primär sollte aber PAL rein. Die Erkennung ist deutlich besser auch in den ZL. Der Fehler mit dem Raumschiff nach Explosion ist bereinigt. Die Übergänge zu den ZL und zurück habe ich noch etwas "weicher" gemacht, man kann bis zum Ende die Raumschiffe abschießen. Das Alienraumschiff explodiert jetzt in der richtigen Höhe.

Den Timer - wie von dir vorgeschlagen - habe ich noch nicht drin... das überlege ich mir noch. Viel Platz für Code habe ich nicht mehr, wobei durch Optimierungen eher noch etwas Platz dazugekommen ist -n aber nicht viel. Vielleicht baue ich noch einen Antrieb unter die kleinen Alienschiffe... ist aber kompliziert!

Das Spiel läuft jetzt wirklich stabil von vorne nach hinten... es spielt sich nicht leicht, aber ich habe es nun gefühlt 1000 x getestet und alle Passagen sind zu schaffen!

Der Score zählt noch recht schnell hoch, das werde ich wohl noch etwas reduzieren - aber das sind Kleinigkeiten. Ich fühle, daß es nun fast fertig ist und bald zur Abgabe kommt. Daher jetzt die Bitte an dich es intensiv zu testen auf Fehler und etwaige Probleme, die ich noch nicht gesehen habe.

Irgendwie ein Zeichen: Zeitgleich mit dem letzten Test von Beta 8 ist mir der Emulator kaputt gegangen... ;-)

LG Peter

Antworten

Hi!

Da ist etwas schief gegangen?

https://www.grewe.eu/demo/Buggy.m4v

Die Musik ist unsauber... und die Geschwindigkeit unstet? Beim Kamp hat man manchmal das Gefühl der Schuss vom Boss beginnt bei einem direkt. Ein Neustart des Spiels bringt noch mehr Soundfehler :-)

Janko

Antworten

Hallo und guten Morgen, hattest du schon Gelegenheit über Beta 10 zu schauen? Läuft die jetzt wieder stabil? Gruß Peter

Antworten

Moin, da Du im Urlaub bist, wollte ich mir Zeit lassen und hab noch nicht geschaut. Also genieße deinen Urlaub 🤗👍

Antworten

Guten Morgen Janko, letzter Urlaubstag heute.... ab morgen Abend kann ich endlich an BoE weiterarbeiten... wie geht es mit Schränker2 voran? LG Peter

Antworten

Prodehl schrieb: letzter Urlaubstag heute.... ab morgen Abend kann ich endlich an BoE weiterarbeiten...

Moin!

Das klingt jetzt seltsam :mrgreen: Die Fotos von Deinem Urlaub lassen einen schönen Urlaub vermuten? Habe extra Dich nicht angeschrieben, damit Du den Kopf frei von BoE und dem Programmieren bekommst und Dich richtig im Urlaub entspannen kannst :-)

Schränker2 macht mir immer mehr Spaß, da ich gut voran komme. Eigentlich ist das Level 1 komplett spielbar und somit das Spiel von der Funktion her fertig. Menü, Musik und Level fehlen noch. Matthias lässt mich aber leider hängen. Er vertröstet mich ständig wg. der Musik... ja, die ist schon seit 2-3 Wochen gebucht.

Grüße Janko

PS: Genieß Deinen letzten Urlaubstag noch!

Antworten

Moin!

So, nun wieder zum Ernst des Lebens :mrgreen:

Kleiner Grafikfehler... könnte man etwas schicker machen. (nach links rücken) FL01.png

Das kommt, wenn man sich durchkämpft und dann auf den Boss treffen soll: Fl02.png

Die Highscore ist auch noch etwas seltsam :-) FL03.png

Wenn man das Spiel neu startet (nach dem Bosskampf oder immer, weiß nicht mehr), wackelt das gesamte Spielfeld hoch und runter. fl04.png

So, nun hast Du eine Ausrede, wieso Du bei so schönem Wetter am Computer sitzen musst :shock: :mrgreen:

Hoffe Du hast Dich gut im Urlaub erholt und konntest den Alltag ein wenig hinter Dich lassen.

Grüße Janko

Antworten

... Hallo Janko, wie geht es dir? Was macht Schränker II? Ich habe gestern BoE auf meinem Atari 130 XE getestet und bin quasi fehlerlos zum Endgegner gekommen... läuft also. Jetzt konzentriere ich mich so langsam auf CoE (Caverns of Eris) und habe schon Thomas Allen angehauen für ein entsprechendes neues Musikstück. Heute Abend habe ich ein wenig Zeit und werde mal anfangen in einer Kopie von BoE die Parts rauszuschneiden, die ich für Teil 2 verwenden kann. Man muss ja nicht alles komplett neu programmieren. Gruß Peter

Antworten

Hallo!

Haben zufällig eben auch BoE gespielt.

Nach dem Bosskampf ist es Dir und mir klar, dass man laden soll. Aber jemand Anders würde eher versuchen die weissen Steine zu zerschießen. :-)

Auch kommt dann der Text das man es geschafft hat und man mit START nocheinmal Spielen kann... aber es ist gar nicht klar, dass man eigentlich nur sein Spiel fortsetzt. Okay, man merkt es dann, aber wer jetzt abschaltet hat seinen Namen nicht in die Highscore eingetragen.

Ansonsten habe ich auch kaum Fehler im Spiel gesehen. Hier und da mal eine Grafik die nicht wollte, wie sie sollte. Aber das kann man nicht immer alles verhindern.

Grüße Janko

Antworten

... das schaue ich mir nochmal an. Vielleicht passe ich den Text noch einwenig an und das mit dem Landen... hmmm.. ich könnte die Kollisionserkennung dann abschalten, aber eigentlich müsste ein Hinweis her, daß man jetzt landen soll. Dafür reicht der Speicher kaum noch aus ....ich lasse mir da was einfallen!! Gruß Peter

Antworten

... gerade zermartere ich mir den Kopf, ob es analog zum vertikal Feinscroll mit DL-Flip eine Möglichkeit gibt für den horizontal Feinscroll....

Antworten